`
hellsing42
  • 浏览: 258483 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hashTable与HashMap区别

阅读更多

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 算法都大概一样,所以性能不会有很大的差异。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics