Java 集合,也叫作容器,主要是由两大接口派生而来:一个是 Collection
接口,主要用于存放单一元素;另一个是 Map
接口,主要用于存放键值对。对于Collection
接口,下面又有三个主要的子接口:List
、Set
、 Queue
List
: 存储的元素有序、可重复Set
: 存储的元素不可重复Queue
: 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。Map
: 使用键值对存储,key 无序、不可重复,value 无序、可重复
Java 集合提高了数据的存储和处理的灵活性,可以更好地适应现代软件开发中多样化的数据需求,并支持高质量的代码编写
一、List
1.ArrayList
(1)ArrayList 和 Array 的区别
ArrayList
内部基于动态数组实现,比 Array
(静态数组) 更加灵活:
ArrayList
会动态地扩容或缩容ArrayList
允许使用泛型来确保类型安全,Array
不可以ArrayList
中只能存储对象。对于基本类型数据,需要使用对应的包装类。Array
可以直接存储基本类型数据,也可以存储对象ArrayList
支持插入、删除、遍历等常见操作,并且提供了丰富的 API 操作ArrayList
创建时不需要指定大小,而Array
创建时必须指定大小
// 初始化一个 String 类型的 ArrayList
ArrayList<String> stringList = new ArrayList<>(Arrays.asList("hello", "world", "!"));
// 添加元素到 ArrayList 中
stringList.add("goodbye");
System.out.println(stringList);// [hello, world, !, goodbye]
// 修改 ArrayList 中的元素
stringList.set(0, "hi");
System.out.println(stringList);// [hi, world, !, goodbye]
// 删除 ArrayList 中的元素
stringList.remove(0);
System.out.println(stringList); // [world, !, goodbye]
(2)ArrayList 可以添加 null 值吗?
可以但不建议, null
值无意义,会让代码难以维护(比如忘记做判空处理就会导致空指针异常)
ArrayList<String> listOfStrings = new ArrayList<>();
listOfStrings.add(null);
listOfStrings.add("java");
System.out.println(listOfStrings); // [null, "java"]
(3)ArrayList 扩容机制
2.LinkedList
3.ArrayList 与 LinkedList 区别?
- 是否保证线程安全:
ArrayList
和LinkedList
都不同步的,不保证线程安全 - 底层数据结构:
ArrayList
底层使用的是Object
数组;LinkedList
底层使用的是 双向链表 数据结构 - 是否支持快速随机访问:
LinkedList
不支持高效的随机元素访问,而ArrayList
(实现了RandomAccess
接口) 支持快速随机访问(get(int index)
) - 内存空间占用:
ArrayList
的空间浪费主要体现在在 list 列表的结尾会预留一定的容量空间,而 LinkedList 的空间花费则体现在它的每一个元素都需要消耗更多空间
项目中一般不会使用 LinkedList
,几乎都可以用 ArrayList
来代替,并且性能通常会更好!