hashTable与HashMap区别

HashTable的应用非常广泛, HashMap 是新框架中用来代替 HashTable 的类,也就是说建议使用 HashMap ,不要使用 HashTable 。可能你觉得 HashTable 很好用,为什么不用呢?这里简单分析他们的区别。 

  1.HashTable的方法是同步的, HashMap 未经同步, 所以在多线程场合要手动同步HashMap 这个区别就像 VectorArrayList 一样。

 2.HashTable不允许 null(keyvalue 都不可以 ),HashMap 允许 null(keyvalue 都可以 )

 3.HashTable有一个 contains(Object value) ,功能和 containsValue(Object value) 功能一样。

 4. HashTable使用 EnumerationHashMap 使用 Iterator  以上只是表面的不同,它们的实现也有很大的不同。

 5.HashTable中 hash 数组默认大小是 11 ,增加的方式是  old*2+1HashMaphash 数组的默认大小是 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);
 }
 以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如HashMapnull 的操作。

Hashtable和 HashMap 的区别:
1.Hashtable是 Dictionary 的子类, HashMapMap 接口的一个实现类;
 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 类,而 HashMapJava1.2 引进的 Map interface 的一个实现
  
 HashMap允许将 null 作为一个 entrykey 或者 value ,而 Hashtable 不允许
  
 还有就是,HashMapHashtablecontains 方法去掉了,改成 containsvaluecontainsKey 。因为 contains 方法容易让人引起误解。

最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在
 多个线程访问Hashtable 时,不需要自己为它的方法实现同步,而 HashMap
 就必须为之提供外同步。
  
 Hashtable和 HashMap 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差异。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值