主要是总结,毕竟源码大家都有。
相同点:
1.都实现了map接口,查找存放位置时都用来hash值计算
2.hashtable 实现的是map接口,必须要实现的方法是hash和equals方法
3.rehash时,newCapacity的计算方式是一样的
int newCapacity = (oldCapacity << 1) + 1;
不同点:
1.hashmap继承自AbstractMap hashtable 继承自Dictionary
2.hashmap允许键值为空,hashtable不允许。在hashmap中value值可以有相同,但是key值不能有相同,相同则覆盖
3.hashmap中与元素读写相关的操作都没有加Synchronize,而hashtable中都加了。即hasnmap是线程不安全的,而hashtable是线程安全的
4.在hashmap的底层是一个数组+多个链表,hashtable是一个数组。
5.hashtable 默认数组的大小是11,重载因子0.75f。在hashmap中,默认大小是1<<4 即16,而最大值是1<<30即2的30次方
6.hash值的计算方式不同。
注意:在hashmap中。键值都可以为空,所以不能用get() ==null 来判断是否含有某个建,因为结果为null可能是没有该键,可能是该键的值为null,
所以在hashmap中要用containsKey()来判断是否存在某个键。
threshold是指rehash的临界值,下面是计算方式
<span style="font-size:18px;"><span style="font-family:Microsoft YaHei;font-size:14px;">threshold = (int)Math.min(newCapacity * loadFactor, MAX_ARRAY_SIZE + 1);</span></span>