1. List(列表)
核心特性:
- 有序集合:元素按插入顺序存储,可通过索引(下标)访问
- 允许重复元素
常见实现类:
ArrayList
:基于动态数组,随机访问快(O(1)),插入/删除慢(需移动元素)LinkedList
:基于双向链表,插入/删除快(O(1)),随机访问慢(O(n))Vector
:线程安全版ArrayList
(已过时,建议用CopyOnWriteArrayList
)
典型方法:
list.add("A"); // 添加元素 list.get(0); // 通过索引访问 list.remove("A"); // 删除元素
- 使用场景:
需要保留插入顺序、允许重复元素,或需频繁通过索引访问(如用户操作记录、动态数组)
2. Set(集合)
核心特性:
- 元素唯一性:不允许重复(依赖
equals()
和hashCode()
) - 无序性:不保证存储顺序(
LinkedHashSet
和TreeSet
除外)
- 元素唯一性:不允许重复(依赖
常见实现类:
HashSet
:基于哈希表,查询/插入平均O(1),无序LinkedHashSet
:维护插入顺序的HashSet
TreeSet
:基于红黑树,元素按自然顺序或Comparator
排序(O(log n))
典型方法:
set.add("A"); // 添加元素(重复返回false) set.contains("A"); // 检查存在性 set.remove("A"); // 删除元素
- 使用场景:
需要去重(如用户ID集合)、快速存在性检查,或需排序(TreeSet
)
3. Map(映射)
核心特性:
- 键值对存储:元素以
Key-Value
形式存储 - 键唯一性:键不允许重复(值可重复)
- 无序性:不保证键的顺序(
LinkedHashMap
和TreeMap
除外)
- 键值对存储:元素以
常见实现类:
HashMap
:基于哈希表,键/值可为null
,无序LinkedHashMap
:维护插入顺序或访问顺序TreeMap
:键按自然顺序或Comparator
排序Hashtable
:线程安全(已过时,建议用ConcurrentHashMap
)
典型方法:
map.put("Key", 1); // 添加键值对 map.get("Key"); // 通过键获取值 map.keySet(); // 获取所有键的Set
- 使用场景:
键值映射(如缓存、字典)、通过键快速查找值
三者的核心区别总结
特性 | List | Set | Map |
---|---|---|---|
存储结构 | 单列元素 | 单列元素 | 键值对(双列) |
元素顺序 | 有序(插入顺序) | 无序(实现类可有序) | 无序(实现类可有序) |
元素重复性 | 允许重复元素 | 禁止重复元素 | 键唯一,值可重复 |
索引访问 | 支持索引(如get(0) ) | 不支持索引 | 不支持索引(需通过键) |
常见实现类 | ArrayList/LinkedList | HashSet/TreeSet | HashMap/TreeMap |
选择指南
- 需要 保留顺序 + 允许重复 →
List
- 需要 去重 + 快速存在性检查 →
Set
- 需要 键值对映射 →
Map
- 需要 排序 → 选择
TreeSet
/TreeMap
- 需要 保持插入顺序 → 选择
LinkedList
/LinkedHashSet
/LinkedHashMap
注意:线程安全场景下,建议使用CopyOnWriteArrayList
(替代Vector)、ConcurrentHashMap
(替代Hashtable),或通过Collections.synchronizedXXX()
包装。
评论 (0)