Java集合框架深度解析:核心类库与实战应用

25 阅读3分钟

一、Collection体系全景图

Collection体系结构

Java集合框架以Collection接口为根,主要分为三大分支:

  • List:有序可重复集合(ArrayList, LinkedList)
  • Set:无序不重复集合(HashSet, TreeSet)
  • Queue:队列实现(PriorityQueue, ArrayDeque)

二、List核心实现:ArrayList

ArrayList基于动态数组实现,自动扩容机制是其核心特性:

List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");

// 动态扩容过程:
// 1. 检查当前容量
// 2. 容量不足时创建新数组(通常扩容1.5倍)
// 3. 使用System.arraycopy迁移数据

最佳实践:预估数据量初始化容量可避免频繁扩容

List<Integer> bigList = new ArrayList<>(10000); // 指定初始容量

三、Set实现原理与应用

1. HashSet去重机制

List<Integer> numbers = Arrays.asList(1,2,2,3,3,3);
Set<Integer> uniqueSet = new HashSet<>(numbers); // [1,2,3]

2. 哈希算法原理

哈希桶结构

HashSet基于HashMap实现,依赖两个关键约定:

  1. equals():判断对象逻辑相等
  2. hashCode():计算对象存储位置
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. 基本操作

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时转换) HashMap结构

3. 线程安全方案

// 同步包装
Map<String, String> safeMap = Collections.synchronizedMap(new HashMap<>());

// 并发容器
ConcurrentHashMap<String, String> concurrentMap = new ConcurrentHashMap<>();

五、Set实现对比

特性HashSetLinkedHashSetTreeSet
顺序无序插入顺序自然排序
底层实现HashMapLinkedHashMap红黑树
时间复杂度O(1)O(1)O(log n)
线程安全不安全不安全不安全
Set<Integer> hashSet = new HashSet<>();
Set<Integer> linkedSet = new LinkedHashSet<>();
Set<Integer> treeSet = new TreeSet<>();

六、Guava集合扩展

Google Guava提供强大的集合工具:

// 不可变集合
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. 部门用户分组排序

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. 字符串去重保持顺序

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. 字符频率统计

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程序。