java集合快速上手与实践
集合分类:
Collection(单列集合)
- List
- Set
Map 集合(双列集合)
- Map
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
随着 Java 在企业级开发、后端服务及大数据处理中的广泛应用,对集合框架的深入理解显得尤为重要。本文将从各个集合接口的子类入手,结合特征总结与快速上手示例,帮助你在实际开发与日常复习中能够迅速选用并掌握合适的集合类型。 (docs.oracle.com)
一、Collection(单列集合)
1. List 接口子类
1.1 ArrayList
- 特征总结:基于动态数组,支持随机访问,扩容时会按 1.5 倍增长;线程不安全
- 快速上手示例:
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
System.out.println(list.get(1)); // Python
1.2 LinkedList
- 特征总结:基于双向链表,插入删除性能优越,但随机访问需遍历;实现了 Deque 接口。
- 快速上手示例:
Deque<Integer> deque = new LinkedList<>();
deque.addFirst(1);
deque.addLast(2);
System.out.println(deque.removeFirst()); // 1
1.3 Vector
- 特征总结:基于动态数组,线程安全,每次扩容按 2 倍增长;已被现代并发容器取代。
- 快速上手示例:
List<String> vector = new Vector<>();
vector.add("A");
System.out.println(vector.size());
1.4 Stack
- 特征总结:继承自 Vector,实现后进先出(LIFO);已被 Deque 更优选项取代
- 快速上手示例:
Stack<Integer> stack = new Stack<>();
stack.push(5);
System.out.println(stack.pop()); // 5
1.5 CopyOnWriteArrayList
- 特征总结:基于数组,写操作时复制整个底层数组,读操作无锁;适合读多写少场景。
- 快速上手示例:
CopyOnWriteArrayList<String> cowList = new CopyOnWriteArrayList<>();
cowList.add("X");
System.out.println(cowList);
2. Set 接口子类
2.1 HashSet
- 特征总结:基于哈希表,存取性能 O(1),不保证顺序;允许 null。
- 快速上手示例:
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
System.out.println(set.contains(1)); // true
2.2 LinkedHashSet
- 特征总结:在 HashSet 基础上维护插入顺序,迭代有序。
- 快速上手示例:
Set<String> linkedSet = new LinkedHashSet<>();
linkedSet.add("A");
linkedSet.add("B");
linkedSet.forEach(System.out::println);
2.3 TreeSet
- 特征总结:基于红黑树,自动排序,不允许 null;增删查 O(log n)。
- 快速上手示例:
Set<String> tree = new TreeSet<>();
tree.add("b");
tree.add("a");
System.out.println(tree); // [a, b]
2.4 EnumSet
- 特征总结:只可用于枚举类型,内部使用位向量,性能优越;不可空集合。
- 快速上手示例:
enum Day { MON, TUE }
Set<Day> days = EnumSet.of(Day.MON);
System.out.println(days);
2.5 CopyOnWriteArraySet
- 特征总结:基于 CopyOnWriteArrayList,写操作复制数组,读操作无锁;适合并发读多写少。
- 快速上手示例:
CopyOnWriteArraySet<String> cowSet = new CopyOnWriteArraySet<>();
cowSet.add("Z");
System.out.println(cowSet);
二、Map(双列集合)
1. HashMap
- 特征总结:基于哈希表,无序,允许 null 键和值,非线程安全,查找 O(1)。
- 快速上手示例:
Map<String, Integer> map = new HashMap<>();
map.put("Alice", 30);
System.out.println(map.get("Alice")); // 30
2. LinkedHashMap
- 特征总结:维护插入或访问顺序,适合 LRU 缓存实现。
- 快速上手示例:
Map<String, String> lhm = new LinkedHashMap<>();
lhm.put("k1", "v1");
lhm.forEach((k,v)->System.out.println(k+v));
3. TreeMap
- 特征总结:基于红黑树,键排序,不允许 null 键;查找 O(log n)。
- 快速上手示例:
Map<Integer, String> tm = new TreeMap<>();
tm.put(2, "B");
tm.put(1, "A");
System.out.println(tm);
4. Hashtable
- 特征总结:线程安全,已被 ConcurrentHashMap 取代;不允许 null。
- 快速上手示例:
Hashtable<String, Integer> ht = new Hashtable<>();
ht.put("X", 1);
5. ConcurrentHashMap
- 特征总结:分段锁或 CAS 实现高并发,优于 Hashtable。
- 快速上手示例:
ConcurrentHashMap<String, Integer> chm = new ConcurrentHashMap<>();
chm.put("C", 3);
6. WeakHashMap
- 特征总结:键使用弱引用,GC 可回收无外部引用的键。
- 快速上手示例:
Map<Object, String> whm = new WeakHashMap<>();
7. IdentityHashMap
- 特征总结:使用 == 而非 equals 比较键,适合特殊场景。
- 快速上手示例:
Map<String, String> idm = new IdentityHashMap<>();
8. EnumMap
- 特征总结:键仅限枚举,内部用数组实现,性能最优。
- 快速上手示例:
Map<Day, String> em = new EnumMap<>(Day.class);
9. ConcurrentSkipListMap
- 特征总结:跳表实现的并发有序 Map,按键排序,线程安全。
- 快速上手示例:
ConcurrentSkipListMap<Integer, String> cslm = new ConcurrentSkipListMap<>();
注意与区别
- 线程安全集合:老旧的
Vector
、Hashtable
,现代推荐ConcurrentHashMap
、CopyOnWriteArrayList
等。 - 读多写少:
CopyOnWriteArrayList/Set
; - 排序需求:
TreeMap/TreeSet
; - 枚举类型:
EnumMap/EnumSet
性能最优; - 并发有序:
ConcurrentSkipListMap
; - 弱引用场景:
WeakHashMap
自动回收键。