Java 集合框架入门指南:从 Collection 到 Map,基础概念一次吃透

一、集合框架全景图

Java集合框架(JCF)位于java.util包中,核心接口构成树形结构:

Iterable
└── Collection
    ├── List
    ├── Set
    └── Queue
Map

关键特性

  • Collection 存储单一元素
  • Map 存储键值对
  • 所有实现类支持泛型(如 ArrayList<String>

二、Collection 体系精解

1. List 接口(有序可重复)
// ArrayList 示例(数组实现)
List<String> arrayList = new ArrayList<>();
arrayList.add("Java");
arrayList.get(0);  // $O(1)$ 时间复杂度访问

// LinkedList 示例(链表实现)
List<Integer> linkedList = new LinkedList<>();
linkedList.add(1);
linkedList.get(0);  // $O(n)$ 时间复杂度访问

实现类对比

特性 ArrayList LinkedList
底层结构 动态数组 双向链表
随机访问 $O(1)$ $O(n)$
头部插入 $O(n)$ $O(1)$
2. Set 接口(无序唯一)
// HashSet 示例(哈希表实现)
Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Apple");  // 重复元素自动过滤

// TreeSet 示例(红黑树实现)
Set<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);  // 自动排序输出 [1,3]

数学本质:Set 遵循集合论公式 $$ A \cup B = {x \mid x \in A \lor x \in B} $$

3. Queue 接口(先进先出)
Queue<String> queue = new LinkedList<>();
queue.offer("First");
queue.poll();  // 取出"First"

三、Map 体系深度剖析

核心实现类
// HashMap 示例
Map<String, Integer> map = new HashMap<>();
map.put("age", 25);
map.get("age");  // 返回25

// TreeMap 示例(按键排序)
Map<Integer, String> treeMap = new TreeMap<>();
treeMap.put(3, "C");
treeMap.put(1, "A");  // 自动按key排序 {1=A, 3=C}

哈希冲突解决: 采用链地址法,当哈希碰撞时: $$ h(k) \rightarrow \text{桶位置} $$ 桶内使用链表/红黑树存储

四、关键选择策略

  1. 元素唯一性需求

    • 需要唯一:Set 体系
    • 允许重复:List 体系
  2. 排序需求

    • 自然排序:TreeSet/TreeMap
    • 插入顺序:LinkedHashSet/LinkedHashMap
  3. 线程安全场景

    // 传统方案(不推荐)
    List<String> syncList = Collections.synchronizedList(new ArrayList<>());
    
    // 现代方案(Java 5+)
    Map<String, String> concurrentMap = new ConcurrentHashMap<>();
    

五、最佳实践建议

  1. 初始化容量优化

    // 预估元素数量避免扩容
    new ArrayList<>(100); 
    new HashMap<>(16, 0.75f);
    

  2. 遍历方式选择

    // EntrySet遍历Map(性能最优)
    for(Map.Entry<String, Integer> entry : map.entrySet()) {
        entry.getKey();
        entry.getValue();
    }
    

  3. 不可变集合创建(Java 9+)

    List<String> immutableList = List.of("A", "B", "C");
    Set<Integer> immutableSet = Set.of(1, 2, 3);
    

:本文未涵盖Vector/Stack等遗留类,推荐使用ArrayList/ArrayDeque替代

掌握这些核心概念后,开发者可依据具体场景选择最合适的集合类型。下一步可深入学习迭代器模式、泛型擦除机制及Java 8引入的Stream API与集合的交互操作。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐