Skip to content

java.util 包代码说明文档 ​

一、代码结构 ​

1.1 包结构概览 ​

com.linsir.abc.core.base.util/
├── collection/                     # 集合框架
│   ├── list/                       # List实现
│   │   ├── ArrayListImplementation.java        # 动态数组实现
│   │   ├── LinkedListImplementation.java       # 双向链表实现
│   │   └── ListPerformanceComparison.java      # 性能对比
│   ├── set/                        # Set实现
│   │   ├── HashSetImplementation.java          # 哈希集合实现
│   │   └── TreeSetImplementation.java          # 树形集合实现
│   ├── map/                        # Map实现
│   │   ├── HashMapImplementation.java          # 哈希表实现
│   │   ├── TreeMapImplementation.java          # 红黑树Map实现
│   │   └── LinkedHashMapImplementation.java    # 链表哈希Map实现
│   └── queue/                      # Queue实现
│       ├── PriorityQueueImplementation.java    # 优先队列实现
│       └── ArrayDequeImplementation.java       # 双端队列实现
├── stream/                         # Stream API
│   ├── StreamPipelineBuilder.java              # 流管道构建
│   ├── ParallelStreamProcessor.java            # 并行流处理
│   └── CustomCollector.java                    # 自定义收集器
└── concurrent/                     # 并发包
    ├── collection/                 # 并发集合
    │   ├── ConcurrentHashMapImplementation.java  # 并发哈希表
    │   └── CopyOnWriteArrayListImplementation.java # 写时复制列表
    ├── executor/                   # 线程池
    │   ├── ThreadPoolExecutorImplementation.java   # 线程池执行器
    │   ├── ScheduledExecutorImplementation.java    # 定时执行器
    │   └── TaskRejectHandler.java                  # 任务拒绝策略
    └── lock/                       # 锁机制
        ├── ReentrantLockImplementation.java        # 可重入锁
        ├── ReadWriteLockImplementation.java        # 读写锁
        └── ConditionVariable.java                  # 条件变量

1.2 各类详细结构 ​

1.2.1 ArrayListImplementation.java ​

对应JDK类: java.util.ArrayList

JDK源码位置: java.base/java/util/ArrayList.java

类结构:

java
public class ArrayListImplementation<E> implements Iterable<E> {
    // 构造器
    public ArrayListImplementation()                           // 默认容量10
    public ArrayListImplementation(int initialCapacity)        // 指定容量
    
    // 基本操作
    public int size()                                          // 元素数量
    public boolean isEmpty()                                   // 是否为空
    public boolean add(E e)                                    // 添加元素
    public void add(int index, E element)                      // 指定位置添加
    public E get(int index)                                    // 获取元素
    public E set(int index, E element)                         // 设置元素
    public E remove(int index)                                 // 删除元素
    public boolean remove(Object o)                            // 删除对象
    public boolean contains(Object o)                          // 是否包含
    public void clear()                                        // 清空
    
    // 扩容机制
    private void grow(int minCapacity)                         // 扩容方法
}

设计要点:

  • 基于数组存储元素,支持快速随机访问
  • 动态扩容机制:容量不足时扩容为原来的1.5倍
  • 非线程安全,单线程环境使用
  • 时间复杂度:get/set O(1),add/remove O(n)

JDK对应方法:

本类方法JDK方法说明
ArrayListImplementation()ArrayList()默认构造
size()ArrayList.size()获取大小
add(E)ArrayList.add(E)添加元素
add(int, E)ArrayList.add(int, E)指定位置添加
get(int)ArrayList.get(int)获取元素
set(int, E)ArrayList.set(int, E)设置元素
remove(int)ArrayList.remove(int)删除指定位置
remove(Object)ArrayList.remove(Object)删除指定对象
grow()ArrayList.grow()扩容方法(private)

扩容流程:

初始容量: 10
添加元素 -> 容量不足 -> 扩容: 10 * 1.5 = 15
继续添加 -> 容量不足 -> 扩容: 15 * 1.5 = 22
...

1.2.2 LinkedListImplementation.java ​

对应JDK类: java.util.LinkedList

JDK源码位置: java.base/java/util/LinkedList.java

类结构:

java
public class LinkedListImplementation<E> implements Iterable<E> {
    // 节点类
    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;
    }
    
    // 构造器
    public LinkedListImplementation()
    
    // 基本操作
    public int size()
    public boolean isEmpty()
    public boolean add(E e)
    public void add(int index, E element)
    public E get(int index)
    public E remove(int index)
    
    // 双端队列操作
    public void addFirst(E e)                                  // 头部添加
    public void addLast(E e)                                   // 尾部添加
    public E removeFirst()                                     // 头部删除
    public E removeLast()                                      // 尾部删除
    public E getFirst()                                        // 获取头部
    public E getLast()                                         // 获取尾部
}

设计要点:

  • 基于双向链表结构,支持高效的头尾操作
  • 不需要扩容,动态分配节点内存
  • 非线程安全
  • 时间复杂度:get O(n),addFirst/addLast O(1)

JDK对应方法:

本类方法JDK方法说明
LinkedListImplementation()LinkedList()默认构造
addFirst(E)LinkedList.addFirst(E)头部添加
addLast(E)LinkedList.addLast(E)尾部添加
removeFirst()LinkedList.removeFirst()头部删除
removeLast()LinkedList.removeLast()尾部删除
getFirst()LinkedList.getFirst()获取头部
getLast()LinkedList.getLast()获取尾部
NodeLinkedList.Node节点内部类

1.2.3 HashMapImplementation.java ​

对应JDK类: java.util.HashMap

JDK源码位置: java.base/java/util/HashMap.java

类结构:

java
public class HashMapImplementation<K, V> {
    // 节点类
    static class Node<K, V> {
        final int hash;                                        // 哈希值
        final K key;                                           // 键
        V value;                                               // 值
        Node<K, V> next;                                       // 下一个节点
    }
    
    // 构造器
    public HashMapImplementation()
    public HashMapImplementation(int initialCapacity)
    
    // 基本操作
    public int size()
    public boolean isEmpty()
    public V put(K key, V value)                               // 添加键值对
    public V get(Object key)                                   // 获取值
    public V remove(Object key)                                // 删除键值对
    public boolean containsKey(Object key)                     // 是否包含键
    public boolean containsValue(Object value)                 // 是否包含值
    public void clear()
    
    // 内部方法
    private int hash(Object key)                               // 哈希函数
    private Node<K, V>[] resize()                              // 扩容方法
    private void treeifyBin(Node<K, V>[] tab, int hash)        // 链表转红黑树
}

设计要点:

  • 基于数组+链表/红黑树的存储结构
  • 哈希冲突解决:链地址法(链表长度>8时转红黑树)
  • 负载因子0.75,扩容时重新哈希
  • 允许null键和null值
  • 非线程安全

JDK对应方法:

本类方法JDK方法说明
HashMapImplementation()HashMap()默认构造
put(K, V)HashMap.put(K, V)添加键值对
get(Object)HashMap.get(Object)获取值
remove(Object)HashMap.remove(Object)删除键值对
containsKey()HashMap.containsKey()包含键检查
hash()HashMap.hash()哈希函数
resize()HashMap.resize()扩容方法
treeifyBin()HashMap.treeifyBin()链表转红黑树
NodeHashMap.Node节点类

HashMap存储结构:

数组(桶数组):
[0] -> Node(key1, value1) -> Node(key2, value2) -> null
[1] -> null
[2] -> Node(key3, value3) -> null
[3] -> TreeNode (红黑树,当链表长度>8)
...
[n-1] -> null

1.2.4 TreeMapImplementation.java ​

对应JDK类: java.util.TreeMap

JDK源码位置: java.base/java/util/TreeMap.java

类结构:

java
public class TreeMapImplementation<K extends Comparable<K>, V> {
    // 节点类(红黑树)
    private static class Entry<K, V> {
        K key;
        V value;
        Entry<K, V> left;                                      // 左子节点
        Entry<K, V> right;                                     // 右子节点
        Entry<K, V> parent;                                    // 父节点
        boolean color;                                         // 颜色(红黑)
    }
    
    // 基本操作
    public V put(K key, V value)
    public V get(Object key)
    public V remove(Object key)
    public K firstKey()                                        // 最小键
    public K lastKey()                                         // 最大键
    
    // 红黑树操作
    private void rotateLeft(Entry<K, V> p)                     // 左旋
    private void rotateRight(Entry<K, V> p)                    // 右旋
    private void fixAfterInsertion(Entry<K, V> x)              // 插入修复
    private void fixAfterDeletion(Entry<K, V> x)               // 删除修复
}

设计要点:

  • 基于红黑树实现,保证O(log n)的操作时间复杂度
  • 键必须实现Comparable接口或提供Comparator
  • 按键的自然顺序或指定顺序排序
  • 非线程安全

JDK对应方法:

本类方法JDK方法说明
put(K, V)TreeMap.put(K, V)添加键值对
get(Object)TreeMap.get(Object)获取值
remove(Object)TreeMap.remove(Object)删除键值对
firstKey()TreeMap.firstKey()最小键
lastKey()TreeMap.lastKey()最大键
rotateLeft()TreeMap.rotateLeft()左旋操作
rotateRight()TreeMap.rotateRight()右旋操作
fixAfterInsertion()TreeMap.fixAfterInsertion()插入修复
EntryTreeMap.Entry红黑树节点

1.2.5 PriorityQueueImplementation.java ​

对应JDK类: java.util.PriorityQueue

JDK源码位置: java.base/java/util/PriorityQueue.java

类结构:

java
public class PriorityQueueImplementation<E extends Comparable<E>> {
    // 存储结构(完全二叉堆)
    private Object[] queue;
    
    // 基本操作
    public boolean offer(E e)                                  // 添加元素
    public E poll()                                            // 移除并返回队首
    public E peek()                                            // 查看队首
    public int size()
    public boolean isEmpty()
    
    // 堆操作
    private void siftUp(int k, E x)                            // 上浮
    private void siftDown(int k, E x)                          // 下沉
    private void heapify()                                     // 建堆
}

设计要点:

  • 基于完全二叉堆(小顶堆)实现
  • 队首元素是优先级最高的元素(最小值)
  • offer/poll操作时间复杂度O(log n)
  • peek操作时间复杂度O(1)
  • 非线程安全

JDK对应方法:

本类方法JDK方法说明
offer(E)PriorityQueue.offer(E)添加元素
poll()PriorityQueue.poll()移除并返回队首
peek()PriorityQueue.peek()查看队首
siftUp()PriorityQueue.siftUp()上浮调整
siftDown()PriorityQueue.siftDown()下沉调整
heapify()PriorityQueue.heapify()建堆

堆结构示例:

        1
      /   \
     3     5
    / \   /
   7   9 8

1.2.6 StreamPipelineBuilder.java ​

对应JDK类: java.util.stream.Stream

JDK源码位置: java.base/java/util/stream/Stream.java

类结构:

java
public class StreamPipelineBuilder<T> {
    // 中间操作
    public StreamPipelineBuilder<T> filter(Predicate<T> predicate)      // 过滤
    public <R> StreamPipelineBuilder<R> map(Function<T, R> mapper)      // 映射
    public StreamPipelineBuilder<T> sorted()                            // 排序
    public StreamPipelineBuilder<T> distinct()                          // 去重
    public StreamPipelineBuilder<T> limit(long maxSize)                 // 限制
    public StreamPipelineBuilder<T> skip(long n)                        // 跳过
    
    // 终止操作
    public void forEach(Consumer<T> action)                             // 遍历
    public List<T> toList()                                             // 转列表
    public long count()                                                 // 计数
    public Optional<T> findFirst()                                      // 查找首个
    public boolean anyMatch(Predicate<T> predicate)                     // 任意匹配
    public <R, A> R collect(Collector<T, A, R> collector)               // 收集
    
    // 执行管道
    public List<T> execute()                                            // 执行操作链
}

设计要点:

  • 延迟执行(Lazy Evaluation):中间操作不立即执行
  • 管道操作:多个操作串联形成处理链
  • 短路操作:limit、findFirst等可以提前终止
  • 无状态与有状态操作:distinct、sorted需要维护状态

JDK对应方法:

本类方法JDK方法说明
filter()Stream.filter()过滤操作
map()Stream.map()映射操作
sorted()Stream.sorted()排序操作
distinct()Stream.distinct()去重操作
limit()Stream.limit()限制操作
skip()Stream.skip()跳过操作
forEach()Stream.forEach()遍历操作
count()Stream.count()计数操作
findFirst()Stream.findFirst()查找首个
anyMatch()Stream.anyMatch()任意匹配
collect()Stream.collect()收集操作

Stream执行流程:

数据源 -> 中间操作1 -> 中间操作2 -> ... -> 终止操作
         (filter)      (map)              (collect)

1.2.7 ThreadPoolExecutorImplementation.java ​

对应JDK类: java.util.concurrent.ThreadPoolExecutor

JDK源码位置: java.base/java/util/concurrent/ThreadPoolExecutor.java

类结构:

java
public class ThreadPoolExecutorImplementation {
    // 线程池状态
    private static final int RUNNING    = -1 << 29;            // 运行中
    private static final int SHUTDOWN   =  0 << 29;            // 关闭
    private static final int STOP       =  1 << 29;            // 停止
    private static final int TIDYING    =  2 << 29;            // 整理中
    private static final int TERMINATED =  3 << 29;            // 已终止
    
    // 核心参数
    private final int corePoolSize;                            // 核心线程数
    private final int maximumPoolSize;                         // 最大线程数
    private final long keepAliveTime;                          // 空闲线程存活时间
    private final BlockingQueue<Runnable> workQueue;           // 任务队列
    private final ThreadFactory threadFactory;                 // 线程工厂
    private final RejectedExecutionHandler handler;            // 拒绝策略
    
    // 操作方法
    public void execute(Runnable command)                      // 执行任务
    public void shutdown()                                     // 优雅关闭
    public void shutdownNow()                                  // 立即关闭
    public boolean isShutdown()
    public boolean isTerminated()
    
    // 拒绝策略
    public static class AbortPolicy implements RejectedExecutionHandler      // 抛出异常
    public static class CallerRunsPolicy implements RejectedExecutionHandler // 调用者执行
    public static class DiscardPolicy implements RejectedExecutionHandler    // 静默丢弃
    public static class DiscardOldestPolicy implements RejectedExecutionHandler // 丢弃最旧
}

设计要点:

  • 核心线程数:常驻线程数量,即使空闲也保留
  • 最大线程数:线程池允许的最大线程数
  • 任务队列:存储等待执行的任务
  • 拒绝策略:当线程池和队列都满时的处理策略

JDK对应方法:

本类方法JDK方法说明
execute()ThreadPoolExecutor.execute()执行任务
shutdown()ThreadPoolExecutor.shutdown()优雅关闭
shutdownNow()ThreadPoolExecutor.shutdownNow()立即关闭
isShutdown()ThreadPoolExecutor.isShutdown()是否关闭
isTerminated()ThreadPoolExecutor.isTerminated()是否终止
AbortPolicyThreadPoolExecutor.AbortPolicy拒绝异常策略
CallerRunsPolicyThreadPoolExecutor.CallerRunsPolicy调用者执行策略
DiscardPolicyThreadPoolExecutor.DiscardPolicy静默丢弃策略
DiscardOldestPolicyThreadPoolExecutor.DiscardOldestPolicy丢弃最旧策略

线程池工作流程:

提交任务 -> 核心线程是否已满?
    否 -> 创建核心线程执行任务
    是 -> 任务队列是否已满?
        否 -> 加入任务队列
        是 -> 线程数是否达到最大?
            否 -> 创建非核心线程执行任务
            是 -> 执行拒绝策略

1.2.8 ConcurrentHashMapImplementation.java ​

对应JDK类: java.util.concurrent.ConcurrentHashMap

JDK源码位置: java.base/java/util/concurrent/ConcurrentHashMap.java

类结构:

java
public class ConcurrentHashMapImplementation<K, V> {
    // 段(Segment)结构
    static class Segment<K, V> {
        final ReadWriteLock lock;                              // 读写锁
        volatile HashEntry<K, V>[] table;                      // 哈希表
    }
    
    // 构造器
    public ConcurrentHashMapImplementation()
    public ConcurrentHashMapImplementation(int initialCapacity)
    
    // 基本操作(线程安全)
    public V put(K key, V value)
    public V get(Object key)
    public V remove(Object key)
    public int size()
    public boolean isEmpty()
    
    // 并发控制
    private Segment<K, V> segmentFor(int hash)                 // 获取段
    private int hash(Object key)                               // 哈希函数
}

设计要点:

  • 分段锁(Segment):将哈希表分成多个段,每段独立加锁
  • 读操作:不需要加锁,使用volatile保证可见性
  • 写操作:只锁定相关段,不同段可并行写入
  • 高并发场景下性能优于Hashtable和Collections.synchronizedMap

JDK对应方法:

本类方法JDK方法说明
put(K, V)ConcurrentHashMap.put(K, V)线程安全添加
get(Object)ConcurrentHashMap.get(Object)线程安全获取
remove(Object)ConcurrentHashMap.remove(Object)线程安全删除
size()ConcurrentHashMap.size()获取大小
SegmentConcurrentHashMap.Segment (JDK7)分段锁结构
segmentFor()ConcurrentHashMap.segmentFor()获取段(JDK7)

分段锁结构:

ConcurrentHashMap:
├── Segment[0] (锁A)
│   └── table[0...n]
├── Segment[1] (锁B)
│   └── table[0...n]
├── Segment[2] (锁C)
│   └── table[0...n]
...
└── Segment[15] (锁P)
    └── table[0...n]

1.2.9 ReentrantLockImplementation.java ​

对应JDK类: java.util.concurrent.locks.ReentrantLock

JDK源码位置: java.base/java/util/concurrent/locks/ReentrantLock.java

类结构:

java
public class ReentrantLockImplementation implements Lock {
    // 同步器
    private final Sync sync;
    
    // 抽象同步器
    abstract static class Sync extends AbstractQueuedSynchronizer {
        abstract void lock();
        final boolean nonfairTryAcquire(int acquires)          // 非公平获取
        protected final boolean tryRelease(int releases)       // 尝试释放
    }
    
    // 公平/非公平同步器
    static final class NonfairSync extends Sync                // 非公平锁
    static final class FairSync extends Sync                   // 公平锁
    
    // 锁操作
    public void lock()                                         // 获取锁
    public void lockInterruptibly() throws InterruptedException // 可中断获取
    public boolean tryLock()                                   // 尝试获取
    public boolean tryLock(long timeout, TimeUnit unit)        // 超时获取
    public void unlock()                                       // 释放锁
    public Condition newCondition()                            // 创建条件变量
    public boolean isLocked()                                  // 是否被锁定
    public boolean isHeldByCurrentThread()                     // 当前线程是否持有
    public int getHoldCount()                                  // 持有计数
}

设计要点:

  • 可重入:同一线程可以多次获取锁,计数器记录重入次数
  • 公平/非公平:公平锁按请求顺序获取,非公平锁允许插队
  • 独占锁:同一时间只有一个线程可以持有锁
  • 条件变量:支持多个等待队列

JDK对应方法:

本类方法JDK方法说明
lock()ReentrantLock.lock()获取锁
lockInterruptibly()ReentrantLock.lockInterruptibly()可中断获取
tryLock()ReentrantLock.tryLock()尝试获取
tryLock(long, TimeUnit)ReentrantLock.tryLock(long, TimeUnit)超时获取
unlock()ReentrantLock.unlock()释放锁
newCondition()ReentrantLock.newCondition()创建条件变量
isLocked()ReentrantLock.isLocked()是否被锁定
isHeldByCurrentThread()ReentrantLock.isHeldByCurrentThread()当前线程是否持有
getHoldCount()ReentrantLock.getHoldCount()持有计数
SyncReentrantLock.Sync同步器抽象类
NonfairSyncReentrantLock.NonfairSync非公平同步器
FairSyncReentrantLock.FairSync公平同步器

与synchronized对比:

特性ReentrantLocksynchronized
可重入支持支持
公平性支持公平/非公平非公平
可中断支持不支持
超时获取支持不支持
多条件变量支持不支持
性能高高(JDK6+优化后)

二、代码使用场景 ​

2.1 ArrayListImplementation - 动态数组 ​

适用场景:

  • 频繁随机访问元素(get/set)
  • 元素数量相对固定或增长缓慢
  • 单线程环境
  • 需要快速遍历的场景

使用示例:

java
// 创建列表
ArrayListImplementation<String> list = new ArrayListImplementation<>();

// 添加元素
list.add("元素1");
list.add("元素2");
list.add(1, "插入元素");  // 在索引1处插入

// 访问元素
String first = list.get(0);
list.set(1, "修改后");

// 删除元素
list.remove(0);              // 按索引删除
list.remove("元素2");        // 按对象删除

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

2.2 LinkedListImplementation - 双向链表 ​

适用场景:

  • 频繁在头尾添加/删除元素
  • 实现队列或栈
  • 不需要频繁随机访问
  • 单线程环境

使用示例:

java
// 创建链表
LinkedListImplementation<String> list = new LinkedListImplementation<>();

// 双端操作
list.addFirst("头部");
list.addLast("尾部");
String first = list.getFirst();
String last = list.getLast();
list.removeFirst();
list.removeLast();

// 作为队列使用(FIFO)
list.addLast("任务1");
list.addLast("任务2");
String task = list.removeFirst();  // 取出最先加入的任务

// 作为栈使用(LIFO)
list.addLast("数据1");
list.addLast("数据2");
String data = list.removeLast();   // 取出最后加入的数据

2.3 HashMapImplementation - 哈希表 ​

适用场景:

  • 键值对存储和快速查找
  • 不需要排序的场景
  • 单线程环境
  • 缓存实现

使用示例:

java
// 创建Map
HashMapImplementation<String, Integer> map = new HashMapImplementation<>();

// 添加键值对
map.put("key1", 100);
map.put("key2", 200);

// 获取值
Integer value = map.get("key1");

// 检查键/值
boolean hasKey = map.containsKey("key1");
boolean hasValue = map.containsValue(100);

// 删除键值对
map.remove("key1");

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

2.4 TreeMapImplementation - 红黑树Map ​

适用场景:

  • 需要按键排序的场景
  • 需要范围查询(如查找某个范围内的键)
  • 需要获取最小/最大键
  • 单线程环境

使用示例:

java
// 创建TreeMap
TreeMapImplementation<Integer, String> map = new TreeMapImplementation<>();

// 添加键值对(自动按键排序)
map.put(3, "C");
map.put(1, "A");
map.put(2, "B");

// 获取最小/最大键
Integer min = map.firstKey();   // 1
Integer max = map.lastKey();    // 3

// 范围查询
Map<Integer, String> subMap = map.subMap(1, 3);  // 包含1,不包含3

2.5 PriorityQueueImplementation - 优先队列 ​

适用场景:

  • 任务调度(按优先级执行)
  • 实现Top K问题
  • 合并有序序列
  • 单线程环境

使用示例:

java
// 创建优先队列(小顶堆)
PriorityQueueImplementation<Integer> queue = new PriorityQueueImplementation<>();

// 添加元素
queue.offer(5);
queue.offer(1);
queue.offer(3);

// 获取并移除队首(最小值)
Integer min = queue.poll();  // 1
Integer next = queue.poll(); // 3

// 查看队首不移除
Integer peek = queue.peek(); // 5

2.6 StreamPipelineBuilder - Stream流处理 ​

适用场景:

  • 集合数据的过滤、映射、转换
  • 复杂的数据处理管道
  • 函数式编程风格
  • 延迟执行优化性能

使用示例:

java
// 创建Stream
StreamPipelineBuilder<Integer> stream = StreamPipelineBuilder.of(1, 2, 3, 4, 5);

// 链式操作
List<Integer> result = stream
    .filter(n -> n > 2)           // 过滤大于2的
    .map(n -> n * n)              // 映射为平方
    .sorted((a, b) -> b - a)      // 降序排序
    .limit(2)                     // 限制2个
    .toList();                    // 收集为列表
// 结果: [25, 16]

// 复杂收集
Map<String, List<Integer>> grouped = StreamPipelineBuilder.of(1, 2, 3, 4, 5, 6)
    .collect(Collectors.groupingBy(n -> n % 2 == 0 ? "偶数" : "奇数"));
// 结果: {奇数=[1, 3, 5], 偶数=[2, 4, 6]}

2.7 ThreadPoolExecutorImplementation - 线程池 ​

适用场景:

  • 异步任务执行
  • 批量任务处理
  • 定时任务调度
  • 限制并发线程数

使用示例:

java
// 创建线程池
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(100);
ThreadFactory factory = Executors.defaultThreadFactory();
ThreadPoolExecutorImplementation.RejectedExecutionHandler handler = 
    new ThreadPoolExecutorImplementation.CallerRunsPolicy();

ThreadPoolExecutorImplementation executor = new ThreadPoolExecutorImplementation(
    5,                      // 核心线程数
    10,                     // 最大线程数
    60L,                    // 空闲线程存活时间
    TimeUnit.SECONDS,       // 时间单位
    queue,                  // 任务队列
    factory,                // 线程工厂
    handler                 // 拒绝策略
);

// 提交任务
executor.execute(() -> {
    System.out.println("任务执行: " + Thread.currentThread().getName());
});

// 优雅关闭
executor.shutdown();
executor.awaitTermination(60, TimeUnit.SECONDS);

2.8 ConcurrentHashMapImplementation - 并发哈希表 ​

适用场景:

  • 高并发读写的键值对存储
  • 缓存实现(多线程环境)
  • 计数器(如访问统计)
  • 线程安全的配置存储

使用示例:

java
// 创建并发Map
ConcurrentHashMapImplementation<String, Integer> map = new ConcurrentHashMapImplementation<>();

// 多线程并发操作
ExecutorService executor = Executors.newFixedThreadPool(10);

for (int i = 0; i < 100; i++) {
    final int index = i;
    executor.execute(() -> {
        map.put("key" + index, index);
        Integer value = map.get("key" + index);
        System.out.println("Thread: " + Thread.currentThread().getName() + 
                          ", Key: key" + index + ", Value: " + value);
    });
}

executor.shutdown();

2.9 ReentrantLockImplementation - 可重入锁 ​

适用场景:

  • 需要更灵活的锁控制
  • 需要可中断的锁获取
  • 需要超时获取锁
  • 需要多个条件变量

使用示例:

java
// 创建锁(非公平)
ReentrantLockImplementation lock = new ReentrantLockImplementation();
Condition condition = lock.newCondition();

// 基本使用
lock.lock();
try {
    // 临界区代码
    System.out.println("获取锁,执行临界区代码");
} finally {
    lock.unlock();
}

// 可中断获取
try {
    lock.lockInterruptibly();
    try {
        // 临界区代码
    } finally {
        lock.unlock();
    }
} catch (InterruptedException e) {
    // 处理中断
}

// 超时获取
if (lock.tryLock(5, TimeUnit.SECONDS)) {
    try {
        // 临界区代码
    } finally {
        lock.unlock();
    }
} else {
    System.out.println("获取锁超时");
}

三、测试代码结构 ​

3.1 测试包结构 ​

src/test/java/com/linsir/abc/core/base/util/
├── collection/
│   ├── list/
│   │   ├── ArrayListImplementationTest.java
│   │   ├── LinkedListImplementationTest.java
│   │   └── ListPerformanceComparisonTest.java
│   ├── set/
│   │   ├── HashSetImplementationTest.java
│   │   └── TreeSetImplementationTest.java
│   ├── map/
│   │   ├── HashMapImplementationTest.java
│   │   ├── TreeMapImplementationTest.java
│   │   └── LinkedHashMapImplementationTest.java
│   └── queue/
│       ├── PriorityQueueImplementationTest.java
│       └── ArrayDequeImplementationTest.java
├── stream/
│   ├── StreamPipelineBuilderTest.java
│   ├── ParallelStreamProcessorTest.java
│   └── CustomCollectorTest.java
└── concurrent/
    ├── collection/
    │   ├── ConcurrentHashMapImplementationTest.java
    │   └── CopyOnWriteArrayListImplementationTest.java
    ├── executor/
    │   ├── ThreadPoolExecutorImplementationTest.java
    │   ├── ScheduledExecutorImplementationTest.java
    │   └── TaskRejectHandlerTest.java
    └── lock/
        ├── ReentrantLockImplementationTest.java
        ├── ReadWriteLockImplementationTest.java
        └── ConditionVariableTest.java

3.2 测试类结构示例 ​

ArrayListImplementationTest.java ​

java
public class ArrayListImplementationTest {
    // 构造器测试
    @Test void testDefaultConstructor()           // 默认构造
    @Test void testConstructorWithCapacity()       // 指定容量构造
    
    // 基本操作测试
    @Test void testAdd()                           // 添加元素
    @Test void testAddAtIndex()                    // 指定位置添加
    @Test void testGet()                           // 获取元素
    @Test void testSet()                           // 设置元素
    @Test void testRemove()                        // 删除元素
    @Test void testContains()                      // 包含检查
    @Test void testClear()                         // 清空
    
    // 边界测试
    @Test void testAddAtIndexOutOfBounds()         // 索引越界
    @Test void testGetOutOfBounds()                // 获取越界
    @Test void testRemoveOutOfBounds()             // 删除越界
    
    // 扩容测试
    @Test void testGrow()                          // 扩容机制
    @Test void testIterator()                      // 迭代器
}

HashMapImplementationTest.java ​

java
public class HashMapImplementationTest {
    // 基本操作测试
    @Test void testPut()                           // 添加键值对
    @Test void testGet()                           // 获取值
    @Test void testRemove()                        // 删除键值对
    @Test void testContainsKey()                   // 包含键
    @Test void testContainsValue()                 // 包含值
    @Test void testSize()                          // 大小
    @Test void testIsEmpty()                       // 是否为空
    @Test void testClear()                         // 清空
    
    // 哈希冲突测试
    @Test void testHashCollision()                 // 哈希冲突处理
    @Test void testResize()                        // 扩容
    @Test void testNullKey()                       // null键
    @Test void testNullValue()                     // null值
}

ThreadPoolExecutorImplementationTest.java ​

java
public class ThreadPoolExecutorImplementationTest {
    // 构造器测试
    @Test void testConstructor()                   // 正常构造
    @Test void testConstructorInvalidArguments()   // 非法参数
    
    // 任务执行测试
    @Test void testExecute()                       // 执行任务
    @Test void testExecuteMultipleTasks()          // 多任务执行
    
    // 生命周期测试
    @Test void testShutdown()                      // 优雅关闭
    @Test void testShutdownNow()                   // 立即关闭
    @Test void testIsShutdown()                    // 是否关闭
    @Test void testIsTerminated()                  // 是否终止
    
    // 拒绝策略测试
    @Test void testAbortPolicy()                   // 拒绝异常
    @Test void testCallerRunsPolicy()              // 调用者执行
    @Test void testDiscardPolicy()                 // 静默丢弃
    @Test void testDiscardOldestPolicy()           // 丢弃最旧
}

四、单元测试预期结果 ​

4.1 ArrayListImplementationTest 预期结果 ​

测试方法预期结果说明
testDefaultConstructor✅ PASS默认构造,容量10,size=0
testConstructorWithCapacity✅ PASS指定容量构造成功
testAdd✅ PASS添加元素成功,size增加
testAddAtIndex✅ PASS指定位置插入正确
testGet✅ PASS获取元素正确
testSet✅ PASS设置元素正确,返回旧值
testRemove✅ PASS删除元素正确,返回被删元素
testContains✅ PASS包含检查正确
testClear✅ PASS清空后size=0
testAddAtIndexOutOfBounds✅ PASS抛出IndexOutOfBoundsException
testGetOutOfBounds✅ PASS抛出IndexOutOfBoundsException
testGrow✅ PASS扩容后容量为原来的1.5倍
testIterator✅ PASS迭代器遍历正确

4.2 LinkedListImplementationTest 预期结果 ​

测试方法预期结果说明
testAdd✅ PASS添加元素成功
testAddFirst✅ PASS头部添加正确
testAddLast✅ PASS尾部添加正确
testGetFirst✅ PASS获取头部正确
testGetLast✅ PASS获取尾部正确
testRemoveFirst✅ PASS删除头部正确
testRemoveLast✅ PASS删除尾部正确
testQueueOperations✅ PASS队列操作正确(FIFO)
testStackOperations✅ PASS栈操作正确(LIFO)

4.3 HashMapImplementationTest 预期结果 ​

测试方法预期结果说明
testPut✅ PASS添加键值对成功
testGet✅ PASS获取值正确
testRemove✅ PASS删除键值对正确
testContainsKey✅ PASS包含键检查正确
testContainsValue✅ PASS包含值检查正确
testHashCollision✅ PASS哈希冲突使用链表解决
testResize✅ PASS扩容后重新哈希
testNullKey✅ PASS支持null键
testNullValue✅ PASS支持null值

4.4 TreeMapImplementationTest 预期结果 ​

测试方法预期结果说明
testPut✅ PASS添加键值对并保持有序
testGet✅ PASS获取值正确
testRemove✅ PASS删除键值对正确
testFirstKey✅ PASS返回最小键
testLastKey✅ PASS返回最大键
testSubMap✅ PASS范围查询正确
testTreeBalance✅ PASS红黑树平衡维护正确

4.5 PriorityQueueImplementationTest 预期结果 ​

测试方法预期结果说明
testOffer✅ PASS添加元素并调整堆
testPoll✅ PASS移除并返回队首(最小值)
testPeek✅ PASS查看队首不移除
testHeapOrder✅ PASS堆序性质保持正确
testSiftUp✅ PASS上浮调整正确
testSiftDown✅ PASS下沉调整正确

4.6 StreamPipelineBuilderTest 预期结果 ​

测试方法预期结果说明
testFilter✅ PASS过滤操作正确
testMap✅ PASS映射操作正确
testSorted✅ PASS排序操作正确
testDistinct✅ PASS去重操作正确
testLimit✅ PASS限制操作正确
testSkip✅ PASS跳过操作正确
testCollect✅ PASS收集操作正确
testChaining✅ PASS链式操作正确
testLazyEvaluation✅ PASS延迟执行正确

4.7 ThreadPoolExecutorImplementationTest 预期结果 ​

测试方法预期结果说明
testConstructor✅ PASS构造器参数正确设置
testConstructorInvalidArguments✅ PASS非法参数抛出异常
testExecute✅ PASS任务执行成功
testExecuteMultipleTasks✅ PASS多任务执行正确
testShutdown✅ PASS优雅关闭正确
testShutdownNow✅ PASS立即关闭正确
testIsShutdown✅ PASS关闭状态检查正确
testIsTerminated✅ PASS终止状态检查正确
testAbortPolicy✅ PASS拒绝时抛出异常
testCallerRunsPolicy✅ PASS调用者线程执行
testDiscardPolicy✅ PASS静默丢弃任务
testDiscardOldestPolicy✅ PASS丢弃最旧任务

4.8 ConcurrentHashMapImplementationTest 预期结果 ​

测试方法预期结果说明
testPut✅ PASS线程安全添加
testGet✅ PASS线程安全获取
testRemove✅ PASS线程安全删除
testConcurrentPut✅ PASS并发写入正确
testConcurrentGet✅ PASS并发读取正确
testSegmentLocking✅ PASS分段锁工作正确
testReadWriteLock✅ PASS读写锁工作正确

4.9 ReentrantLockImplementationTest 预期结果 ​

测试方法预期结果说明
testLock✅ PASS获取锁成功
testUnlock✅ PASS释放锁成功
testReentrantLock✅ PASS可重入特性正确
testLockInterruptibly✅ PASS可中断获取正确
testTryLock✅ PASS尝试获取正确
testTryLockWithTimeout✅ PASS超时获取正确
testFairLock✅ PASS公平锁按顺序获取
testNonFairLock✅ PASS非公平锁允许插队
testConditionAwait✅ PASS条件等待正确
testConditionSignal✅ PASS条件通知正确

4.10 所有测试汇总 ​

测试类测试数预期通过率
ArrayListImplementationTest13100%
LinkedListImplementationTest9100%
HashSetImplementationTest8100%
TreeSetImplementationTest7100%
HashMapImplementationTest9100%
TreeMapImplementationTest7100%
LinkedHashMapImplementationTest6100%
PriorityQueueImplementationTest6100%
ArrayDequeImplementationTest7100%
StreamPipelineBuilderTest9100%
ParallelStreamProcessorTest5100%
CustomCollectorTest4100%
ConcurrentHashMapImplementationTest7100%
CopyOnWriteArrayListImplementationTest6100%
ThreadPoolExecutorImplementationTest12100%
ScheduledExecutorImplementationTest5100%
TaskRejectHandlerTest4100%
ReentrantLockImplementationTest10100%
ReadWriteLockImplementationTest6100%
ConditionVariableTest5100%
ListPerformanceComparisonTest3100%
总计147100%

五、运行测试 ​

5.1 运行所有util包测试 ​

bash
mvn test -Dtest="com.linsir.abc.core.base.util.**"

5.2 运行单个模块测试 ​

bash
# 集合测试
mvn test -Dtest="com.linsir.abc.core.base.util.collection.**"

# Stream测试
mvn test -Dtest="com.linsir.abc.core.base.util.stream.**"

# 并发测试
mvn test -Dtest="com.linsir.abc.core.base.util.concurrent.**"

5.3 运行单个测试类 ​

bash
mvn test -Dtest=ArrayListImplementationTest
mvn test -Dtest=HashMapImplementationTest
mvn test -Dtest=ThreadPoolExecutorImplementationTest

5.4 预期输出 ​

Tests run: 147, Failures: 0, Errors: 0, Skipped: 0
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.linsir.abc.core.base.util.collection.list.ArrayListImplementationTest
[INFO] Tests run: 13, Failures: 0, Errors: 0, Skipped: 0
...
[INFO] Running com.linsir.abc.core.base.util.concurrent.executor.ThreadPoolExecutorImplementationTest
[INFO] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0
...
[INFO] BUILD SUCCESS

六、集合选择指南 ​

6.1 List选择 ​

场景推荐类说明
频繁随机访问ArrayListO(1)访问时间
频繁头尾操作LinkedListO(1)头尾操作
需要队列功能LinkedList支持FIFO/LIFO
多线程环境CopyOnWriteArrayList线程安全

6.2 Map选择 ​

场景推荐类说明
快速查找HashMapO(1)平均时间
需要排序TreeMap按键排序
保持插入顺序LinkedHashMap按插入顺序遍历
高并发读写ConcurrentHashMap线程安全,高并发
读多写少ConcurrentHashMap读操作无锁

6.3 Set选择 ​

场景推荐类说明
快速去重HashSet基于HashMap
需要排序TreeSet基于TreeMap
保持插入顺序LinkedHashSet基于LinkedHashMap

6.4 Queue选择 ​

场景推荐类说明
优先级队列PriorityQueue按优先级排序
双端队列ArrayDeque支持头尾操作
阻塞队列LinkedBlockingQueue支持阻塞等待

七、并发工具选择指南 ​

7.1 锁选择 ​

场景推荐类说明
简单同步synchronized语法简洁,性能优秀
需要超时ReentrantLocktryLock支持超时
需要可中断ReentrantLocklockInterruptibly
需要公平性ReentrantLock(公平)按请求顺序获取
读多写少ReadWriteLock读写分离
多条件等待ReentrantLock + Condition多个条件变量

7.2 线程池选择 ​

场景推荐类型说明
固定线程数newFixedThreadPool固定大小线程池
单线程newSingleThreadExecutor顺序执行任务
可缓存newCachedThreadPool弹性线程数
定时任务newScheduledThreadPool支持定时调度
自定义ThreadPoolExecutor完全自定义参数

八、性能对比 ​

8.1 List性能对比 ​

操作ArrayListLinkedList
get(index)O(1)O(n)
add(E)O(1) amortizedO(1)
add(index, E)O(n)O(n)
remove(index)O(n)O(n)
addFirst/removeFirstO(n)O(1)
addLast/removeLastO(1) amortizedO(1)
内存占用较少(数组紧凑)较多(节点开销)

8.2 Map性能对比 ​

操作HashMapTreeMapLinkedHashMapConcurrentHashMap
getO(1)O(log n)O(1)O(1)
putO(1)O(log n)O(1)O(1)
removeO(1)O(log n)O(1)O(1)
有序性否是插入顺序否
线程安全否否否是

8.3 锁性能对比 ​

场景synchronizedReentrantLockReadWriteLock
单线程快快慢
低竞争快快慢
高竞争中等中等中等
读多写少慢慢快
功能丰富度低高高

文档版本: 1.0.0
最后更新: 2026-03-26

Released under the MIT License.