每一次打击都是为了更好的提高,加油!
hashTable默认情况下大小为11。
int index = (hash & 0x7FFFFFFF) % tab.length; hashtable,为什么???
因为:
-
0x7FFFFFFF
是0111 1111 1111 1111 1111 1111 1111 1111:除符号位外的所有1。 -
(hash & 0x7FFFFFFF)
将产生正整数。 -
(hash & 0x7FFFFFFF) % tab.length
将在标签长度的范围内。
所有hashtable采用奇数导致的hash冲突会比较少,采用偶数会导致的冲突会增多。
h & (length-1); hashmap采用相与的方法,所有采用2的幂次方的长度会导致的冲突比较少。
put
不允许value值为null.
if (value == null) {
throw new NullPointerException();
}
是先扩容在添加,而hashmap先添加再扩容
rehash
int newCapacity = oldCapacity * 2 + 1;
hashtable线程遍历是非线程安全的。安全方法参见:
四、HashTable与HashMap的区别
HashTable和HashMap存在很多的相同点,但是他们还是有几个比较重要的不同点。
第一:我们从他们的定义就可以看出他们的不同,HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。
第二:HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。如下:
当HashMap遇到为null的key时,它会调用putForNullKey方法来进行处理。对于value没有进行任何处理,只要是对象都可以。
注意:看jdk源码只有不允许value为null。
-
if (key == null)
-
return putForNullKey(value);
而当HashTable遇到null时,他会直接抛出NullPointerException异常信息。
-
if (value == null) {
-
throw new NullPointerException();
-
}
第三:Hashtable的方法是同步的,而HashMap的方法不是。所以有人一般都建议如果是涉及到多线程同步时采用HashTable,没有涉及就采用HashMap,但是在Collections类中存在一个静态方法:synchronizedMap(),该方法创建了一个线程安全的Map对象,并把它作为一个封装的对象来返回,所以通过Collections类的synchronizedMap方法是可以我们你同步访问潜在的HashMap。这样君该如何选择呢???
参考文章:https://blog.csdn.net/chenssy/article/details/22896871