Java 集合框架完全指南

Java 集合框架完全指南

目录

  1. 集合框架概述
  2. [Collection 接口](#Collection 接口)
  3. [List 列表](#List 列表)
  4. [Set 集合](#Set 集合)
  5. [Queue 队列](#Queue 队列)
  6. [Map 映射](#Map 映射)
  7. 迭代器
  8. [Collections 工具类](#Collections 工具类)
  9. 并发集合
  10. 实战案例
  11. 最佳实践

1. 集合框架概述

1.1 什么是集合框架

Java 集合框架(Java Collections Framework,JCF)是一套用于存储和操作对象集合的统一架构。

1.2 集合框架层次结构

复制代码
                    Iterable
                       │
                   Collection
          ┌────────────┼────────────┐
         List         Set         Queue
          │            │            │
    ┌─────┼─────┐  ┌───┼───┐   ┌────┼────┐
ArrayList  │  Vector  HashSet │  LinkedList │
    LinkedList    TreeSet  SortedSet  PriorityQueue


                      Map
          ┌────────────┼────────────┐
       HashMap     TreeMap     Hashtable
          │
    LinkedHashMap

1.3 常用实现类对比

接口 实现类 特点
List ArrayList 动态数组,随机访问快
List LinkedList 双向链表,插入删除快
Set HashSet 基于 HashMap,无序
Set TreeSet 红黑树,有序
Queue PriorityQueue 优先级堆
Map HashMap 哈希表,无序
Map TreeMap 红黑树,按键排序

2. Collection 接口

2.1 基本方法

java 复制代码
Collection<String> collection = new ArrayList<>();

// 添加元素
collection.add("Apple");
collection.add("Banana");

// 基本查询
collection.size();
collection.isEmpty();
collection.contains("Apple");

// 删除元素
collection.remove("Banana");

// 遍历
for (String item : collection) {
    System.out.println(item);
}
collection.forEach(System.out::println);

// 清空
collection.clear();

2.2 批量操作

java 复制代码
Collection<String> c1 = new ArrayList<>(Arrays.asList("A", "B", "C"));
Collection<String> c2 = new ArrayList<>(Arrays.asList("B", "C", "D"));

// 并集
Collection<String> union = new ArrayList<>(c1);
union.addAll(c2);

// 交集
Collection<String> intersection = new ArrayList<>(c1);
intersection.retainAll(c2);

// 差集
Collection<String> difference = new ArrayList<>(c1);
difference.removeAll(c2);

2.3 条件删除(Java 8+)

java 复制代码
Collection<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
numbers.removeIf(n -> n % 2 == 0);  // 删除偶数

3. List 列表

3.1 ArrayList

java 复制代码
List<String> list = new ArrayList<>();

// 基本操作
list.add("Apple");
list.add(0, "Banana");
list.set(0, "Cherry");
String item = list.get(0);
list.remove(0);

// 搜索
int index = list.indexOf("Apple");

// 子列表
List<String> subList = list.subList(0, 2);

3.2 LinkedList

java 复制代码
LinkedList<String> list = new LinkedList<>();

// 双端操作
list.addFirst("First");
list.addLast("Last");
list.removeFirst();
list.removeLast();

// 栈操作
list.push("Element");
list.pop();

// 队列操作
list.offer("Element");
list.poll();

3.3 ArrayList vs LinkedList

特性 ArrayList LinkedList
随机访问 O(1) O(n)
头部插入/删除 O(n) O(1)
尾部插入/删除 O(1) O(1)
适用场景 频繁随机访问 频繁插入删除

4. Set 集合

4.1 HashSet

java 复制代码
Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Apple");  // 重复元素不会被添加
set.remove("Apple");
boolean contains = set.contains("Apple");

4.2 TreeSet

java 复制代码
TreeSet<Integer> numbers = new TreeSet<>();
numbers.addAll(Arrays.asList(5, 3, 7, 1, 9));

// NavigableSet 方法
numbers.lower(5);    // 小于 5 的最大元素
numbers.higher(5);   // 大于 5 的最小元素
numbers.first();     // 最小元素
numbers.last();      // 最大元素

4.3 HashSet vs TreeSet

特性 HashSet TreeSet
顺序 无序 排序
null 允许 不允许
复杂度 O(1) O(log n)

5. Queue 队列

5.1 ArrayDeque

java 复制代码
Deque<String> deque = new ArrayDeque<>();

// 队列操作
deque.offer("A");
deque.poll();

// 栈操作
deque.push("B");
deque.pop();

// 双端操作
deque.addFirst("First");
deque.addLast("Last");

5.2 PriorityQueue

java 复制代码
// 最小堆
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
minHeap.offer(3);
minHeap.offer(1);
minHeap.poll();  // 1

// 最大堆
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());

6. Map 映射

6.1 HashMap

java 复制代码
Map<String, Integer> map = new HashMap<>();

// 基本操作
map.put("Apple", 1);
map.get("Apple");
map.getOrDefault("Grape", 0);
map.remove("Apple");
map.containsKey("Apple");

// 遍历
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}
map.forEach((k, v) -> System.out.println(k + ": " + v));

6.2 Java 8+ 新方法

java 复制代码
map.putIfAbsent("B", 2);
map.computeIfAbsent("C", k -> k.length());
map.computeIfPresent("A", (k, v) -> v + 1);
map.merge("A", 1, Integer::sum);

6.3 TreeMap

java 复制代码
TreeMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(3, "Three");
treeMap.put(1, "One");

// NavigableMap 方法
treeMap.lowerEntry(2);
treeMap.higherEntry(2);
treeMap.firstEntry();
treeMap.lastEntry();

7. 迭代器

7.1 Iterator

java 复制代码
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));

Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String item = it.next();
    if (item.equals("B")) {
        it.remove();  // 安全删除
    }
}

7.2 ListIterator

java 复制代码
ListIterator<String> listIt = list.listIterator();

// 双向遍历
while (listIt.hasNext()) {
    listIt.next();
}
while (listIt.hasPrevious()) {
    listIt.previous();
}

// 修改
listIt.set("X");
listIt.add("Y");

8. Collections 工具类

8.1 排序和搜索

java 复制代码
List<Integer> list = new ArrayList<>(Arrays.asList(3, 1, 4, 1, 5));

Collections.sort(list);
Collections.sort(list, Comparator.reverseOrder());
int index = Collections.binarySearch(list, 4);
Integer max = Collections.max(list);
Integer min = Collections.min(list);

8.2 修改操作

java 复制代码
Collections.reverse(list);
Collections.shuffle(list);
Collections.rotate(list, 2);
Collections.swap(list, 0, 1);
Collections.fill(list, 0);

8.3 创建特殊集合

java 复制代码
List<String> emptyList = Collections.emptyList();
List<String> singletonList = Collections.singletonList("A");
List<String> nCopies = Collections.nCopies(5, "A");

// 同步包装
List<String> syncList = Collections.synchronizedList(new ArrayList<>());

// 不可变包装
List<String> unmodifiable = Collections.unmodifiableList(list);

9. 并发集合

9.1 ConcurrentHashMap

java 复制代码
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("A", 1);
map.putIfAbsent("B", 2);
map.computeIfAbsent("C", k -> k.length());

9.2 CopyOnWriteArrayList

java 复制代码
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("A");
list.addIfAbsent("B");

9.3 BlockingQueue

java 复制代码
BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
queue.put("A");        // 阻塞直到有空间
queue.take();          // 阻塞直到有元素
queue.offer("B", 1, TimeUnit.SECONDS);  // 超时

10. 实战案例

10.1 统计单词频率

java 复制代码
public Map<String, Long> countWords(String text) {
    return Arrays.stream(text.toLowerCase().split("\\W+"))
        .filter(word -> !word.isEmpty())
        .collect(Collectors.groupingBy(
            Function.identity(),
            Collectors.counting()
        ));
}

10.2 LRU 缓存

java 复制代码
class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int maxSize;
    
    public LRUCache(int maxSize) {
        super(16, 0.75f, true);
        this.maxSize = maxSize;
    }
    
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > maxSize;
    }
}

10.3 分组统计

java 复制代码
Map<String, List<User>> usersByCity = users.stream()
    .collect(Collectors.groupingBy(User::getCity));

Map<String, Long> countByCity = users.stream()
    .collect(Collectors.groupingBy(User::getCity, Collectors.counting()));

11. 最佳实践

11.1 选择合适的集合

需求 推荐集合
有序、可重复 ArrayList
频繁插入删除 LinkedList
不重复、无序 HashSet
不重复、有序 TreeSet
键值对、无序 HashMap
键值对、有序 TreeMap
线程安全 Map ConcurrentHashMap

11.2 编程建议

java 复制代码
// ✅ 面向接口编程
List<String> list = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();

// ✅ 指定初始容量
List<String> list = new ArrayList<>(100);
Map<String, Integer> map = new HashMap<>(100);

// ✅ 使用 isEmpty() 而非 size() == 0
if (list.isEmpty()) { }

// ✅ 使用 for-each 或 forEach
for (String item : list) { }
list.forEach(System.out::println);

// ✅ 使用 computeIfAbsent
map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);

附录:集合速查表

时间复杂度

操作 ArrayList LinkedList HashSet TreeSet HashMap TreeMap
添加 O(1)* O(1) O(1) O(log n) O(1) O(log n)
删除 O(n) O(1) O(1) O(log n) O(1) O(log n)
查找 O(n) O(n) O(1) O(log n) O(1) O(log n)
访问 O(1) O(n) - - O(1) O(log n)

*均摊复杂度

相关推荐
日月云棠10 小时前
各版本JDK对比:JDK 25 特性详解
java
用户83071968408211 小时前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide11 小时前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
IT探险家12 小时前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺12 小时前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
用户9083246027312 小时前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端
桦说编程12 小时前
实战分析 ConcurrentHashMap.computeIfAbsent 的锁冲突问题
java·后端·性能优化
程序员清风16 小时前
用了三年AI,我总结出高效使用AI的3个习惯!
java·后端·面试
beata17 小时前
Java基础-13: Java反射机制详解:原理、使用与实战示例
java·后端
用户03321266636717 小时前
Java 使用 Spire.Presentation 在 PowerPoint 中添加或删除表格行与列
java