一、Collection体系全景图

Java集合框架以Collection接口为根,主要分为三大分支:
- List:有序可重复集合(ArrayList, LinkedList)
- Set:无序不重复集合(HashSet, TreeSet)
- Queue:队列实现(PriorityQueue, ArrayDeque)
二、List核心实现:ArrayList
ArrayList基于动态数组实现,自动扩容机制是其核心特性:
java
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
// 动态扩容过程:
// 1. 检查当前容量
// 2. 容量不足时创建新数组(通常扩容1.5倍)
// 3. 使用System.arraycopy迁移数据
最佳实践:预估数据量初始化容量可避免频繁扩容
java
List<Integer> bigList = new ArrayList<>(10000); // 指定初始容量
三、Set实现原理与应用
1. HashSet去重机制
java
List<Integer> numbers = Arrays.asList(1,2,2,3,3,3);
Set<Integer> uniqueSet = new HashSet<>(numbers); // [1,2,3]
2. 哈希算法原理

HashSet基于HashMap实现,依赖两个关键约定:
equals():判断对象逻辑相等hashCode():计算对象存储位置
java
class Person {
String name;
@Override
public boolean equals(Object o) {
return name.equals(((Person)o).name);
}
@Override
public int hashCode() {
return name.hashCode();
}
}
四、Map核心实现:HashMap
1. 基本操作
java
Map<String, Integer> map = new HashMap<>();
map.put("Java", 1995);
map.put("Python", 1991);
// 遍历方式
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
2. 底层结构演进
- JDK7:数组+链表
- JDK8+:数组+链表/红黑树(链表长度>8时转换)

3. 线程安全方案
java
// 同步包装
Map<String, String> safeMap = Collections.synchronizedMap(new HashMap<>());
// 并发容器
ConcurrentHashMap<String, String> concurrentMap = new ConcurrentHashMap<>();
五、Set实现对比
| 特性 | HashSet | LinkedHashSet | TreeSet |
|---|---|---|---|
| 顺序 | 无序 | 插入顺序 | 自然排序 |
| 底层实现 | HashMap | LinkedHashMap | 红黑树 |
| 时间复杂度 | O(1) | O(1) | O(log n) |
| 线程安全 | 不安全 | 不安全 | 不安全 |
java
Set<Integer> hashSet = new HashSet<>();
Set<Integer> linkedSet = new LinkedHashSet<>();
Set<Integer> treeSet = new TreeSet<>();
六、Guava集合扩展
Google Guava提供强大的集合工具:
java
// 不可变集合
ImmutableSet<String> colors = ImmutableSet.of("Red", "Green", "Blue");
// 多重集合
Multiset<String> multiset = HashMultiset.create();
multiset.add("Java");
multiset.add("Java", 3); // 添加3次
// 双向映射
BiMap<String, Integer> biMap = HashBiMap.create();
biMap.put("Java", 1);
biMap.inverse().get(1); // 返回"Java"
七、实战应用案例
1. 部门用户分组排序
java
public static Map<String, List<User>> groupByDepartment(List<User> users) {
Map<String, List<User>> result = new HashMap<>();
users.forEach(user -> {
result.computeIfAbsent(user.getDepartment(), k -> new ArrayList<>())
.add(user);
});
result.values().forEach(list ->
list.sort(Comparator.comparingInt(User::getAge))
);
return result;
}
2. 字符串去重保持顺序
java
public static String removeDuplicates(String input) {
Set<Character> charSet = new LinkedHashSet<>();
for (char c : input.toCharArray()) {
charSet.add(c);
}
StringBuilder sb = new StringBuilder();
charSet.forEach(sb::append);
return sb.toString();
}
3. 字符频率统计
java
public class CharCounter {
private final Map<Character, Integer> counts = new HashMap<>();
public CharCounter(String str) {
str.chars().forEach(c ->
counts.merge((char)c, 1, Integer::sum)
);
}
public int commonCharsCount(CharCounter other) {
Set<Character> intersection = new HashSet<>(counts.keySet());
intersection.retainAll(other.counts.keySet());
return intersection.size();
}
}
总结
Java集合框架提供了丰富的数据结构实现,理解其核心原理是高效开发的基础。ArrayList的动态数组机制适合随机访问,HashSet/HashMap依赖哈希算法实现高效查找,TreeSet/TreeMap通过红黑树保证有序性。实战中要注意:预估容量减少扩容开销、正确实现equals/hashCode保证集合行为正确、使用LinkedHashSet保持插入顺序。Guava库提供了不可变集合等强大扩展,而ConcurrentHashMap解决了并发场景下的线程安全问题。掌握这些核心知识,能够根据需求选择最佳集合类型,编写出高效稳健的Java程序。