List<String> list = new ArrayList<>(); // 默认容量10
// 悄悄增长的秘密
int newCapacity = oldCapacity + (oldCapacity >> 1); // 1.5倍
特点:
适用场景:
List<String> list = new LinkedList<>(); // 不需要扩容
特点:
幽默时刻:
ArrayList vs LinkedList 插入对比:
// 头部插入10000次
ArrayList: 152ms
LinkedList: 3ms
// LinkedList胜出!
// 随机访问第5000个元素
ArrayList: 0.01ms
LinkedList: 12ms
// ArrayList碾压!
List<String> list = new Vector<>(); // 默认扩容2倍
特点:
怀旧场景:
Set<String> set = new HashSet<>(); // 底层是HashMap
魔法原理:
碰撞实验:
public class HashSetTest {
public static void main(String[] args) {
String s1 = "通话";
String s2 = "重地";
System.out.println(s1.hashCode() == s2.hashCode()); // true!
}
}
不同的字符串可能有相同的hashCode,就像不同的人可能身份证尾号相同~
Set<String> set = new LinkedHashSet<>(); // 记住插入顺序
特点:
适用场景:
Map<String, Integer> map = new HashMap<>(); // 默认加载因子0.75
核心原理:
幽默时刻:
Map<String, Integer> map = new LinkedHashMap<>(16, 0.75f, true);
// accessOrder=true实现LRU
特点:
实战场景:
// 实现简易LRU缓存
Map<String, Object> cache = new LinkedHashMap<>(100, 0.75f, true) {
private boolean removeEldestEntry(Map.Entry eldest) {
return size() > 100;
}
};
Map<String, Integer> map = new ConcurrentHashMap<>();
并发秘籍:
性能对比:
Hashtable:全局锁 → 慢如蜗牛
ConcurrentHashMap:细粒度锁 → 快如闪电
需求 | 推荐选择 | 原因 |
---|---|---|
快速随机访问 | ArrayList | 数组结构速度飞起 |
频繁增删 | LinkedList | 链表操作O(1) |
去重存储 | HashSet | 哈希查找O(1) |
去重且保序 | LinkedHashSet | 双向链表记录顺序 |
一般键值存储 | HashMap | 综合性能最佳 |
需要访问顺序 | LinkedHashMap | 维护插入/访问顺序 |
高并发环境 | ConcurrentHashMap | 分段锁降低竞争 |