HashMap与HashTable区别
本章节基于主流的jdk8;废话不多说,走你!
1、安全性
HashMap是线程非安全的,Hashtable是线程安全的。
查看源码可以发现,Hashtable.put() 是用 synchronized 修饰的线程安全的同步方法;
HashMap.put()部分源码:
putVal()方法自行查阅jdk源码;不多累赘;
HashTable.put()部分源码:
2、数据格式
HashMap的key、value可以为null,Hashtable的key、value不能为null
HashTable.put()源代码:
3、初始化容量及容量不足
HashMap不指定容量时,默认容量为16,容量不足扩容为原来的2倍;HashMap如果指定了容量大小,那么HashMap会将其扩容为2的幂次方大小。
HashMap:
Hashtable不指定容量时,默认容量为11,容量不足时扩容为原来的2倍+1;Hashtable如果指定了容量大小,那么容量大小就是所指定的容量。
HashTable:
4、索引位置计算
获得元素在哈希数组的位置:①计算hashcode ② 基于该hash值求出下标位置
HashMap:
将哈希表的大小固定为了2的幂,因为是取模得到索引值,故这样取模时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多
HashTable:
5、数据结构
HashMap:哈希数组+链表+红黑树(点击知道啥是红黑树?)
HashTable:哈希数组+链表