Skip to content

Java 集合底层原理


一、List(有序、可重复)

实现类底层结构特点时间复杂度
ArrayList动态数组随机访问快,增删慢查 O(1) / 增删 O(n)
LinkedList双向链表增删快,随机访问慢查 O(n) / 增删 O(1)
Vector动态数组(线程安全)已淘汰查 O(1) / 增删 O(n)

ArrayList 原理

java
// 默认容量 10
Object[] elementData;

// 扩容机制:原容量 × 1.5
// 10 → 15 → 22 → 33 → ...

// 随机访问快
E get(int index) {
    return elementData[index];  // O(1)
}

// 中间插入慢(需要移动元素)
void add(int index, E element) {
    System.arraycopy(...);  // O(n)
}

LinkedList 原理

java
// 双向链表
Node<E> first;
Node<E> last;

static class Node<E> {
    E item;
    Node<E> next;
    Node<E> prev;
}

// 头尾插入快
void addFirst(E e) { }  // O(1)
void addLast(E e) { }   // O(1)

// 随机访问慢(需要遍历)
E get(int index) { }    // O(n)

二、Set(无序、不可重复)

实现类底层结构特点时间复杂度
HashSetHashMap无序O(1)
LinkedHashSetLinkedHashMap插入顺序O(1)
TreeSetTreeMap(红黑树)排序O(log n)

HashSet 原理

java
// 底层是 HashMap
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();

// add 方法
public boolean add(E e) {
    return map.put(e, PRESENT) == null;  // key 重复则添加失败
}

// 去重原理:hashCode() + equals()

TreeSet 原理

java
// 底层是 TreeMap(红黑树)
private transient NavigableMap<E,Object> m;

// 元素必须实现 Comparable 或提供 Comparator
public int compareTo(E o);

// 自动排序
//     5
//    / \
//   3   8
//  / \
// 1   4

三、Queue(队列)

实现类底层结构特点
PriorityQueue堆(二叉树)优先级队列
ArrayDeque数组双端队列

PriorityQueue 原理

java
// 底层是完全二叉树(小顶堆)
Object[] queue;
int size = 0;

// 队头永远是最小元素
//       1
//      / \
//     3   2
//    / \
//   5   4

// 插入/删除:O(log n)

ArrayDeque 原理

java
// 循环数组
Object[] elements;
int head;  // 头指针
int tail;  // 尾指针

// 扩容:原容量 × 2
// 支持 O(1) 头尾操作

四、Map(键值对)

实现类底层结构特点时间复杂度
HashMap数组 + 链表 + 红黑树无序O(1)
LinkedHashMapHashMap + 双向链表插入顺序O(1)
TreeMap红黑树排序O(log n)
Hashtable数组 + 链表(线程安全)已淘汰O(1)

HashMap 原理(重点)

java
// Java 8+ 结构
// 数组 + 链表 + 红黑树

transient Node<K,V>[] table;

static class Node<K,V> {
    final int hash;
    final K key;
    V value;
    Node<K,V> next;  // 链表指针
}

// 扩容机制:容量 × 2
// 默认容量 16,负载因子 0.75
// 阈值 = 16 × 0.75 = 12

HashMap 结构图:

数组
┌─────────────────────────────────┐
│  0  │  1  │  2  │  3  │  4  │...│
└─────┴─────┴─────┴─────┴─────┴───┘
           │           │
           ▼           ▼
        ┌──────┐   ┌──────┐
        │Node1 │   │Node1 │
        ├──────┤   ├──────┤
        │Node2 │   │Node2 │ (链表长度>8 转红黑树)
        ├──────┤   ├──────┤
        │Node3 │   │Node3 │
        └──────┘   └──────┘

HashMap 关键机制

java
// 1. hash 计算
hash = key.hashCode() ^ (hashCode >>> 16);

// 2. 索引计算
index = (n - 1) & hash;  // n = 数组长度

// 3. 链表转红黑树(Java 8+)
// 链表长度 > 8 且 数组长度 >= 64

// 4. 扩容
// 新容量 = 原容量 × 2
// 重新 hash 分布

LinkedHashMap 原理

java
// HashMap + 双向链表
// 保持插入顺序或访问顺序

static class Entry<K,V> extends HashMap.Node<K,V> {
    Entry<K,V> before, after;  // 双向链表
}

// 遍历顺序 = 插入顺序

五、对比总结

集合底层结构有序性重复性null 值线程安全
ArrayList数组✅ 索引顺序
LinkedList链表✅ 插入顺序
HashSetHashMap
LinkedHashSetLinkedHashMap✅ 插入顺序
TreeSet红黑树✅ 排序
HashMap数组 + 链表 + 树key❌ value✅
LinkedHashMapHashMap+ 链表✅ 插入顺序key❌ value✅
TreeMap红黑树✅ 排序key❌ value✅key❌
PriorityQueue✅ 优先级

六、选择建议

需求推荐
随机访问多ArrayList
增删操作多LinkedList
去重HashSet
保持插入顺序LinkedHashSet / LinkedHashMap
排序TreeSet / TreeMap
优先级队列PriorityQueue
线程安全CopyOnWriteArrayList / ConcurrentHashMap