Java中hashmap和hashtable的区别
1)继承和实现的区别
Hashtable是基于成就的Dictonary类,完成了Map接口;HashMap是java1.2引进的Map接口的
一个实现,继承于AbstractMap,AbstractMap完成了Map接口。
2)线程安全不同
HashTable的方法是同步的,HashMap是未同步,所以在多线程场合要手动同步HashMap。
3)对null的处理
HashTable不允许null值(key和value值都不行),HashMap允许null(key和value都可以)。即
HashTable不允许null值其实在编译期不会有任何不一样,会照样执行。但是在运行时会报空指针异常
HashMap允许null值是指可以有一个或多个键对应的值为null。当get()方法返回null时,即可表示
HashMap中没有该键,也可以表示该键对应的值是null。因此HashMap不能用get方法判断是否包含
某个键,而是应该用containsKey方法来判断。
4)方法不同
HashTable有一个contains方法和HashMap中的containsKey功能一样
5)HashTable使用Enumeration,HashMap使用Iteator。
6)HashTable中hash数组默认大小是11,增加方式是old*2+1,HashMap中hash数组的默认大小是16,
而且一定是2的指数。
7)哈希值得使用不同,HashTable直接使用对象hashCode,代码是这样的:
int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length;
HashMap重新计算hash值,而且用与代替求摸:
int hash = hash(k); int i = indexFor(hash, table.length); static int hash(Object x) { int h = x.hashCode(); h += ~(h << 9); h ^= (h >>> 14); h += (h << 4); h ^= (h >>> 10); return h; } static int indexFor(int h, int length) { return h & (length-1); }