《Java高级编程:从原理到实战 - 进阶知识篇四》

一. 集合框架体系结构

1.1 核心接口层次

1.2 主要实现类对比

接口 有序 可重复 线程安全 主要实现类
List 部分 ArrayList, LinkedList, Vector, CopyOnWriteArrayList
Set 部分 部分 HashSet, LinkedHashSet, TreeSet, CopyOnWriteArraySet
Queue 部分 LinkedList, PriorityQueue, ArrayBlockingQueue
Map 部分 Key唯一 部分 HashMap, LinkedHashMap, TreeMap, ConcurrentHashMap

二. List 接口及实现类

2.1 ArrayList

  • 特点:动态数组实现,随机访问快(O(1)),插入删除慢(O(n))

  • 扩容:默认初始容量10,扩容1.5倍

  • 线程安全 :非线程安全,可用Collections.synchronizedList包装

java 复制代码
List<String> list = new ArrayList<>();
list.add("Java");
list.get(0);  // 随机访问

2.2 LinkedList

  • 特点:双向链表实现,插入删除快(O(1)),随机访问慢(O(n))

  • 额外功能:实现了Deque接口,可用作队列/栈

java 复制代码
LinkedList<String> linkedList = new LinkedList<>();
linkedList.addFirst("First");
linkedList.addLast("Last");

2.3 Vector

  • 特点:线程安全的动态数组(方法同步)

  • 替代方案 :推荐使用CopyOnWriteArrayList

2.4 CopyOnWriteArrayList

  • 特点:写时复制,读操作无锁,适合读多写少场景

  • 缺点:写操作性能较差,内存占用大

三. Set 接口及实现类

3.1 HashSet

  • 特点:基于HashMap实现,无序,允许null元素

  • 性能:添加、删除、包含操作O(1)

java 复制代码
Set<String> set = new HashSet<>();
set.add("Java");
set.contains("Java");  // true

3.2 LinkedHashSet

  • 特点:维护插入顺序的HashSet

  • 实现:继承HashSet,底层使用LinkedHashMap

3.3 TreeSet

  • 特点:基于TreeMap实现,元素有序(自然排序或Comparator)

  • 性能:添加、删除、包含操作O(log n)

java 复制代码
Set<Integer> sortedSet = new TreeSet<>();
sortedSet.add(3);
sortedSet.add(1);  // 自动排序 [1, 3]

四. Queue/Deque 接口及实现类

4.1 PriorityQueue

  • 特点:基于堆的优先级队列,元素按优先级出队

  • 排序:自然排序或Comparator指定

java 复制代码
Queue<Integer> pq = new PriorityQueue<>();
pq.offer(5);
pq.poll();  // 获取最小元素

4.2 ArrayDeque

  • 特点:基于循环数组的双端队列,比LinkedList更高效

  • 用途:可作为栈或队列使用

java 复制代码
Deque<String> deque = new ArrayDeque<>();
deque.push("Java");  // 栈操作
deque.pop();

4.3 BlockingQueue (并发队列)

  • 实现类:ArrayBlockingQueue, LinkedBlockingQueue

  • 特点:线程安全,支持阻塞操作

五. Map 接口及实现类

5.1 HashMap

  • 特点:数组+链表+红黑树(JDK8),允许null键/值

  • 扩容:默认初始容量16,负载因子0.75,扩容2倍

  • 哈希冲突:链表长度>8转红黑树,<6转回链表

java 复制代码
Map<String, Integer> map = new HashMap<>();
map.put("Java", 1);
map.get("Java");

5.2 LinkedHashMap

  • 特点:维护插入顺序或访问顺序

  • 实现LRU :通过重写removeEldestEntry方法

java 复制代码
Map<String, Integer> lruCache = new LinkedHashMap<>(16, 0.75f, true) {
    protected boolean removeEldestEntry(Map.Entry eldest) {
        return size() > 100;
    }
};

5.3 TreeMap

  • 特点:基于红黑树的有序Map,按键排序

  • 性能:查询、插入、删除O(log n)

5.4 ConcurrentHashMap

  • 特点:线程安全,分段锁(JDK7)或CAS+synchronized(JDK8)

  • 优势:高并发性能优于Hashtable

六. 工具类 Collections

6.1 常用方法

java 复制代码
Collections.sort(list);  // 排序
Collections.reverse(list);  // 反转
Collections.synchronizedList(list);  // 线程安全包装
Collections.unmodifiableList(list);  // 不可变包装

6.2 比较器 Comparator

java 复制代码
list.sort(Comparator.comparing(Person::getName)
                    .thenComparingInt(Person::getAge));

七. 集合使用最佳实践

  1. 初始化容量:预估大小避免频繁扩容

  2. 遍历选择

    • List:普通for(ArrayList) / 迭代器(LinkedList)

    • Set/Map:迭代器或forEach

  3. 线程安全选择

    • 低竞争:Collections.synchronizedXxx

    • 高并发:ConcurrentHashMap, CopyOnWriteArrayList

  4. 性能考虑

    • 随机访问多:ArrayList

    • 插入删除多:LinkedList

    • 快速查找:HashSet/HashMap

    • 需要排序:TreeSet/TreeMap

相关推荐
2201_757830872 分钟前
线程池超详细解释
java
今天吃饺子4 分钟前
数据清洗APP重大更新!我用MATLAB写了一个数据清洗APP
开发语言·matlab
编程修仙4 分钟前
第二篇 搭建第一个spring程序
java·数据库·spring
麦麦鸡腿堡5 分钟前
Java_网络上传文件与netstat指令
java·服务器·网络
爱吃烤鸡翅的酸菜鱼7 分钟前
【RabbitMQ】发布订阅架构深度实践:构建高可用异步消息处理系统
java·spring boot·分布式·后端·websocket·架构·rabbitmq
coderxiaohan8 分钟前
【C++】map和set的使用
开发语言·c++
散峰而望9 分钟前
Python 所需软件配置
开发语言·python
组合缺一9 分钟前
Solon AI 开发学习10 - chat - 工具调用概念介绍
java·人工智能·学习·ai·llm·solon
ChrisitineTX12 分钟前
警惕数据“陷阱”:Python 如何自动发现并清洗 Excel 中的异常值?
开发语言·python·excel
曼巴UE512 分钟前
UE5 C++ TSet 创建初始和迭代
java·c++·ue5