接口 | 有序性 | 唯一性 | 线程安全 | 典型实现类 |
---|---|---|---|---|
List | 是 | 允许重复 | 否 | ArrayList, CopyOnWriteArrayList |
Set | 否 | 元素唯一 | 否 | HashSet, ConcurrentSkipListSet |
Queue | 是 | 允许重复 | 部分 | ArrayBlockingQueue, LinkedTransferQueue |
Map | 否 | Key唯一 | 否 | HashMap, ConcurrentHashMap |
ArrayList:
int newCapacity = oldCapacity + (oldCapacity >> 1);
LinkedList:
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
}
实现方式 | 锁粒度 | 适用场景 |
---|---|---|
Vector | 方法级synchronized | 已过时,不推荐使用 |
Collections.synchronizedList | 对象锁 | 低并发场景 |
CopyOnWriteArrayList | 无锁(写时复制) | 读多写少(如黑白名单) |
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
synchronized (node) {
// 操作链表/红黑树
}
场景 | 推荐实现 | 理由 |
---|---|---|
高并发缓存 | ConcurrentHashMap | 分段锁降低冲突 |
需要排序的Key-Value存储 | TreeMap | 红黑树保证有序 |
缓存淘汰策略(LRU) | LinkedHashMap | 重写removeEldestEntry方法 |
队列类型 | 数据结构 | 锁类型 | 适用场景 |
---|---|---|---|
ArrayBlockingQueue | 数组 | ReentrantLock | 固定容量生产消费模型 |
LinkedBlockingQueue | 链表 | 双锁分离 | 高吞吐任务队列 |
PriorityBlockingQueue | 堆 | ReentrantLock | 优先级任务调度 |
SynchronousQueue | 无缓冲 | CAS | 直接传递任务 |
// 初始化Disruptor
Disruptor<Event> disruptor = new Disruptor<>(
Event::new,
1024,
DaemonThreadFactory.INSTANCE,
ProducerType.MULTI, // 多生产者模式
new BlockingWaitStrategy()
);
错误示例:
list.stream()
.filter(s -> s.length() > 3)
.collect(Collectors.toList())
.forEach(System.out::println); // 多次遍历集合
正确优化:
list.stream()
.filter(s -> s.length() > 3)
.forEach(System.out::println); // 单次遍历
List<String> list = List.of("A", "B", "C");
Set<Integer> set = Set.of(1, 2, 3);
Map<String, Integer> map = Map.of("Key1", 1, "Key2", 2);
new ArrayList<>(initialCapacity)
// 随机访问列表
for (int i=0; i < list.size(); i++) {}
// 顺序访问链表
for (Iterator it = list.iterator(); it.hasNext();) {}
int size = list.size();
public class InventoryManager {
private ConcurrentHashMap<String, AtomicInteger> inventory = new ConcurrentHashMap<>();
public boolean deduct(String itemId, int quantity) {
return inventory.computeIfPresent(itemId, (k, v) -> {
int remaining = v.get() - quantity;
return remaining >= 0 ? new AtomicInteger(remaining) : v;
}) != null;
}
}
public class DelayedTask implements Delayed {
private long executeTime;
public long getDelay(TimeUnit unit) {
return unit.convert(executeTime - System.nanoTime(), NANOSECONDS);
}
public int compareTo(Delayed o) {
return Long.compare(executeTime, ((DelayedTask) o).executeTime);
}
}
DelayQueue<DelayedTask> queue = new DelayQueue<>();
List<String> list = new ArrayList<>();
list.add("A");
for (String s : list) {
list.remove(s); // 抛出异常
}
解决方案:
原理:多线程扩容时链表形成环状结构,导致CPU 100%
答案:
功能 | Java | Python | Go |
---|---|---|---|
线程安全Map | ConcurrentHashMap | dict + 全局锁 | sync.Map |
链表实现 | LinkedList | list(动态数组) | list(切片) |
内存优化集合 | Trove/FastUtil | slots | 值类型切片 |
持久化集合 | 无原生支持 | 无原生支持 | 无原生支持 |