杂项
最好不使用 clone()来进行复制,可以使用拷贝构造函数或拷贝工厂来复制对象.
抽象类提供了⼀种 IS-A 的关系
接⼝更像是⼀种 LIKE-A 关系
Fail-Fast 机制
Fail-Fast 机制是 Java 集合(Collection)中的⼀种错误机制。当多个线程对同一个集合的内容进⾏操作时,就可能产⽣线程安全问题。
Fail-Fast 机制会⾃动检测到线程安全问题,在操作前后比较集合的结构变化次数是否相同,并抛出 ConcurrentModificationException 异常。
tips:禁⽌在foreach⾥执⾏元素的删除操作
容器的一些解析
vector和arraylist的比较
vector是同步的,所以开销更大
vector每次扩容请求2倍,而arraylist是1.5倍
如果对线程安全有要求的话,可以选择Collections.synchronizedList() 或者使用CopyOnWriteArrayList保证线程安全。
CopyOnWriteArrayList
写操作在拷贝的数组上进行,而读操作在原数组上进行。
写操作需要加锁,防止并发写操作。
适用于读多写少的场景。
问题:
内存占用约占原数组的两倍。
数据一致性问题。
所以CopyOnWriteArrayList更加适合对内存不敏感以及实时性要求很高的场景。
LinkedList
ArrayList是基于数组实现的,而LinkedList是基于链表实现的。
数组支持随机访问,而链表不支持随机访问。
数组的插入和删除操作需要移动元素,而链表的插入和删除操作只需要修改指针。
数组的空间利用率高,而链表的空间利用率低。
LinkedList适用于需要频繁插入和删除元素的场景。
HashMap
相当于分成了很多个桶,每个桶里面是一个链表,链表的每个节点是一个键值对,使用头插法插入节点。
ConcurrentHashMap
ConcurrentHashMap是线程安全的HashMap,它的实现方式是使用分段锁。
ConcurrentHashMap将整个HashMap分成了多个段,每个段都是一个HashMap。
每个段都有一个锁,当一个线程访问一个段时,其他线程也可以访问其他段。
LinkedHashMap
LinkedHashMap是HashMap的子类,它的实现方式是使用双向链表。
LinkedHashMap的迭代顺序是插入顺序或者访问顺序。
可以通过LinkedHashMap实现LRU缓存。
WeakHashMap
主要是用来实现缓存的。
WeakHashMap的键是弱引用,当键不再被引用时,键值对会被自动移除。
WeakHashMap的迭代器是弱引用的,所以在迭代时可能会出现空指针异常。
ConcurrentCache
ConcurrentCache是一个线程安全的缓存,它的实现方式是使用ConcurrentHashMap。