HashTable的应用非常广泛, HashMap 是新框架中用来代替 HashTable 的类,也就是说建议使用 HashMap ,不要使用 HashTable 。可能你觉得 HashTable 很好用,为什么不用呢?这里简单分析他们的区别。
1.HashTable的方法是同步的, HashMap 未经同步, 所以在多线程场合要手动同步HashMap 这个区别就像 Vector 和 ArrayList 一样。
2.HashTable不允许 null 值 (key 和 value 都不可以 ),HashMap 允许 null 值 (key 和 value 都可以 ) 。
3.HashTable有一个 contains(Object value) ,功能和 containsValue(Object value) 功能一样。
4. HashTable使用 Enumeration , HashMap 使用 Iterator 。 以上只是表面的不同,它们的实现也有很大的不同。
5.HashTable中 hash 数组默认大小是 11 ,增加的方式是 old*2+1 。 HashMap 中 hash 数组的默认大小是 16 ,而且一定是 2 的指数。
6.哈希值的使用不同, 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);
}
以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如HashMap 对 null 的操作。
Hashtable和 HashMap 的区别:
1.Hashtable是 Dictionary 的子类, HashMap 是 Map 接口的一个实现类;
2.Hashtable中的方法是同步的,而 HashMap 中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用 Hashtable 了;而对于 HashMap ,则需要额外的同步机制。但 HashMap 的同步问题可通过 Collections 的一个静态方法得到解决:
Map Collections.synchronizedMap(Map m)
这个方法返回一个同步的Map ,这个 Map 封装了底层的 HashMap 的所有方法,使得底层的 HashMap 即使是在多线程的环境中也是安全的。
3. 在HashMap 中, null 可以作为键,这样的键只有一个 ; 可以有一个或多个键所对应的值为null 。当get() 方法返回 null 值时,即可以表示 HashMap 中没有该键,也可以表示该键所对应的值为 null 。因此,在 HashMap 中不能由 get() 方法来判断 HashMap 中是否存在某个键,而应该用 containsKey() 方法来判断。
Hashtable继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的 Map interface 的一个实现
HashMap允许将 null 作为一个 entry 的 key 或者 value ,而 Hashtable 不允许
还有就是,HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey 。因为 contains 方法容易让人引起误解。
最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在
多个线程访问Hashtable 时,不需要自己为它的方法实现同步,而 HashMap
就必须为之提供外同步。
Hashtable和 HashMap 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差异。