图图图图
嗯 我尽力了T_T
各种对比
-
List中
-
HashMap vs Hashtable vs LinkedHashMap vs TreeMap
hashmap | hashtable | |
---|---|---|
线程安全? | 不安全 | synchronized保证线程安全 |
初始化默认长度 | 16 | 11 |
怎么扩容 | 2*n | 2*n+1 |
null-key,null-value | 可以null-key但只允许一个;允许null-value | 都不行 |
结构 | 数组+链表/红黑树 | 数组+链表 |
继承类 | AbstractMap | Dictionary |
LinkedHashMap继承自HashMap,在HashMap结构的基础上增加了双向链表,是有序的。
TreeMap的底层结构是红黑树,不允许有空值,有序性靠存入元素实现Comparable/Comparator实现。
一致性哈希其实是用TreeMap实现的,感兴趣可以看一下,爱的魔力转圈圈,前人的智慧真是无限~
- Hashtable vs ConcurrentHashMap
Hashtable | ConcurrentHashMap | |
---|---|---|
结构 | 数组+链表 | 分段的数组+链表/红黑树 |
线程安全 | 同一把锁 | 分段锁 |
锁 | synchronized | synchronized和CAS |
ConcurrentHashMap的变化
1.7
一个ConcurrentHashMap包含一个Segment数组,每个Segment中的结构类似于HashMap(HashEntry数组+链表)
1.8取消了Segment分段锁,采用CAS和synchronized保证并发安全:synchronized只锁定链表或红黑树的头结点,只要坐标不冲突就不会产生并发,效率更高;数据结构也变成了数组+链表/红黑树
CAS咋用的?
//如果坐标i桶内为空的话,CAS插入
else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
if (casTabAt(tab, i, null,
new Node<K,V>(hash, key, value, null)))
break; // no lock when adding to empty bin
}
- HashMap vs HashSet
其实HashSet底层是基于HashMap实现的,可以去看一下源码~
比如
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
那hashset是怎么判断重复的呢?
因为hashMap<k,v>的key是唯一的呀
- ArrayList vs LinkedList vs vector
ArrayList | LinkedList | vector | |
---|---|---|---|
线程安全? | No | No | Yes |
数据结构 | Object数组 | 双向链表 | Object数组 |
选择问题 | 随机查找 | 插入删除 | - |
关于A和L的选择,虽然是这么说的,但其实我看了别人的性能测试博客,ArrayList的整体性能是优于LinkedList的