HashTable源码分析
HashTable是一个线程安全的HashMap,是jdk早期版本的产物,但其效率较低
1.初始化
可以看到,与HashMap不同,HashTable无参构造是默认会构造一个容量为11的数组,而HashMap在无参构造初始化时不会构造数组,只有在第一个put后才会构造容量为16的数组
2.put方法
与CurrentHashMap不同,HashTable的处理方法比较粗暴,直接在put方法上加锁,而CurrentHashMap是采用CAS或者对操作的节点对象加锁
HashTable不允许key或value为空,而HashMap可以,下面是HashMap的代码
static final int hash(Object key) {
int h;
//如果key为NULL那么哈希值为0
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
此外,HashTable的底层是数组+链表,当哈希冲突时,只采用链表的方式,而HashMap是树组+链表+红黑树
其他方法大致相同,就不分析了
总结
1.HashTable无参构造在初始化时就创建一个长度11的数组,而HashMap无参构造在第一次put后创建长度为16的数组
2.HashTable不允许key和value为空,而HashMap可以
3.HashTable底层为数组+链表,而HashMap底层为数组+链表+红黑树
4.HashTable解决线程安全的方法是在put等方法上添加synchronized,锁住的是整个HashTable,而CurrentHashMap则是对操作的节点采用CAS或synchronized
我有一壶酒
足以慰风尘
尽倾江海里
赠饮天下人