在 Java 中,Collection
是所有集合类的根接口,它定义了一组对象的基本操作。Java 集合框架提供了丰富的实现类(如List
、Set
、Queue
),具有以下核心特点:
一、统一的接口设计
1. 核心接口层次
Collection (根接口)
├── List (有序可重复)
├── Set (无序不重复)
└── Queue (队列,FIFO)
List
:元素有序、可重复,支持索引访问(如ArrayList
、LinkedList
)。Set
:元素无序、唯一(如HashSet
、TreeSet
)。Queue
:遵循先进先出(FIFO)原则(如LinkedList
、PriorityQueue
)。
2. 共性方法
所有Collection
实现类都支持以下操作:
add(E e); // 添加元素
remove(Object o);// 移除元素
contains(Object o); // 判断是否包含
size(); // 返回元素数量
isEmpty(); // 判断是否为空
clear(); // 清空集合
iterator(); // 获取迭代器
toArray(); // 转换为数组
二、动态扩容机制
- 自动调整大小:大部分集合类(如
ArrayList
、HashMap
)会在元素数量超过容量时自动扩容。 - 扩容策略:
ArrayList
:初始容量为 10,扩容时新容量 = 旧容量 × 1.5。HashMap
:初始容量为 16,负载因子 0.75,扩容时新容量 = 旧容量 × 2。
三、线程安全与非线程安全
1. 非线程安全实现
ArrayList
、HashSet
、HashMap
等:性能高,但不支持多线程并发访问。
List<String> list = new ArrayList<>(); // 非线程安全
2. 线程安全实现
Vector
、Hashtable
:早期线程安全类,通过synchronized
实现,性能较低。Collections.synchronizedXXX()
:将非线程安全集合转换为线程安全集合。
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
java.util.concurrent
包:CopyOnWriteArrayList
、ConcurrentHashMap
:高效的线程安全集合,采用写时复制或分段锁机制。
四、高效的迭代与遍历
1. 迭代器(Iterator
)
- 所有集合都支持通过
iterator()
方法获取迭代器,实现统一遍历。
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
2. for-each
循环
- 语法糖,底层依赖迭代器实现。
for (String element : list) {
System.out.println(element);
}
五、丰富的数据结构实现
1. List
的实现类
ArrayList
:基于动态数组,随机访问快(O (1)),插入 / 删除慢(O (n))。LinkedList
:基于双向链表,插入 / 删除快(O (1)),随机访问慢(O (n))。
2. Set
的实现类
HashSet
:基于哈希表,无序,元素唯一。TreeSet
:基于红黑树,有序(自然排序或自定义排序)。LinkedHashSet
:基于哈希表 + 链表,保持插入顺序。
3. Map
的实现类
HashMap
:键值对存储,无序,允许null
键和null
值。TreeMap
:基于红黑树,按键有序。LinkedHashMap
:保持插入顺序或访问顺序。
六、泛型支持
- 类型安全:Java 5 引入泛型后,集合可以指定存储的元素类型。
List<String> list = new ArrayList<>(); // 只能存储String类型
list.add("Java");
// list.add(123); // 编译错误
七、与数组的互操作性
- 集合转数组:通过
toArray()
方法。
List<String> list = Arrays.asList("A", "B", "C");
String[] array = list.toArray(new String[0]);
数组转集合:通过Arrays.asList()
方法。
String[] array = {"A", "B", "C"};
List<String> list = Arrays.asList(array);
八、性能特点对比
操作 | ArrayList | LinkedList | HashSet | TreeSet |
---|---|---|---|---|
随机访问 | O(1) | O(n) | - | - |
插入 / 删除尾部 | O(1) | O(1) | O(1) | O(log n) |
插入 / 删除中间 | O(n) | O(1) | - | - |
查找元素 | O(n) | O(n) | O(1) | O(log n) |
九、常见注意事项
-
null
值处理:ArrayList
、HashMap
允许存储null
,而TreeSet
、TreeMap
不允许(因依赖比较器)。
-
equals()
和hashCode()
:- 若元素需存储在
HashSet
或HashMap
中,必须正确重写equals()
和hashCode()
方法。
- 若元素需存储在
-
fail-fast 机制:
- 当集合在迭代过程中被修改时,会抛出
ConcurrentModificationException
。
- 当集合在迭代过程中被修改时,会抛出
Java 集合框架通过统一接口、丰富实现和高效算法,为开发者提供了灵活且高性能的数据结构选择,适用于各种场景。合理选择集合类型(如ArrayList
vs LinkedList
、HashMap
vs TreeMap
)是优化代码性能的关键。