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)

*均摊复杂度

相关推荐
冷雨夜中漫步24 分钟前
Claude Code源码分析——Claude Code Agent Loop 详细设计文档
java·开发语言·人工智能·ai
直奔標竿29 分钟前
Java开发者AI转型第二十六课!Spring AI 个人知识库实战(五)——联网搜索增强实战
java·开发语言·人工智能·spring boot·后端·spring
one_love_zfl1 小时前
java面试-微服务组件篇
java·微服务·面试
一只大袋鼠1 小时前
Java进阶:CGLIB动态代理解析
java·开发语言
环流_1 小时前
HTTP 协议的基本格式
java·网络协议·http
爱滑雪的码农1 小时前
Java基础十三:Java中的继承、重写(Override)与重载(Overload)详解
java·开发语言
【 】4232 小时前
C++&STL(Standard Template Library,标准模板库)
java·开发语言·c++
茉莉玫瑰花茶2 小时前
LangChain 核心组件 [ 2 ]
java·数据库·langchain
信徒_2 小时前
ID 生成技术选型
java
a8a3022 小时前
Laravel8.x新特性全解析
java·spring boot·后端