FAQ8.15 HashMap和Hashtable有什么区别?

Hashtable是Dictionary的子类并实现了Map接口;而HashMap是Map接口的一个实现类。除了不同步和允许使用null之外,HashMap类与Hashtable大致相同。

在HashMap中,null可以作为键,但是这样的键只允许有一个,而作为键值允许存在一个或者多个null值。当调用get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该使用containsKey()方法来判断。

Hashtable中的方法是同步的,而HashMap中方法在默认情况下是非同步的。


    发现遍历List<T>的速度比遍历Dictionary<Guid,int>快得不少.为什么会这样呢,不是很明白?
    
5. 问题剖析
 
同样是集合,为什么性能会有这样的差距。我们要从存储结构和操作系统的原理谈起。

 首先我们清楚List<T>是对数组做了一层包装,我们在数据结构上称之为线性表,而线性表的概念是,在内存中的连续区域,除了首节点和尾节点外,

每个节点都有着其唯一的前驱结点和后续节点。我们在这里关注的是连续这个概念。而HashTable或者Dictionary,他是根据Key而根据Hash算法分析

产生的内存地址,因此在宏观上是不连续的,虽然微软对其算法也进行了很大的优化。由于这样的不连续,在遍历时,Dictionary必然会产生大量的内

存换页操作,而List只需要进行最少的内存换页即可,这就是List和Dictionary在遍历时效率差异的根本原因。

 
6. 再谈Dictionary
 
也许很多人说,既然Dictionary如此强大,那么我们为什么不用Dictionary来代替一切集合呢?

 在这里我们除了刚才的遍历问题,还要提到Dictionary的存储空间问题,在Dictionary中,除了要存储我们实际需要的Value外,还需要一个辅助变量Key,

这就造成了内存空间的双重浪费。而且在尾部插入时,List只需要在其原有的地址基础上向后延续存储即可,而Dictionary却需要经过复杂的Hash计算,

这也是性能损耗的地方。


java.util
类 Dictionary<K,V>

java.lang.Object
  继承者 java.util.Dictionary<K,V>
直接已知子类:
Hashtable

public abstract class Dictionary<K,V>
   
    extends 
    Object
   
 

Dictionary 类是任何可将键映射到相应值的类(如 Hashtable)的抽象父类。每个键和每个值都是一个对象。在任何一个 Dictionary 对象中,每个键至多与一个值相关联。给定一个 Dictionary 和一个键,就可以查找所关联的元素。任何非 null 对象都可以用作键或值。

通常,应该在此类的实现中使用 equals 方法,以决定两个键是否相同。

注:此类已过时。新的实现应该实现 Map 接口,而不是扩展此类。

从以下版本开始:
JDK1.0
另请参见:
Map, Object.equals(java.lang.Object), Object.hashCode(), Hashtable

构造方法摘要
Dictionary()
单独的构造方法。

方法摘要
 elements()
返回此 dictionary 中值的枚举。

get(Object key)
返回此 dictionary 中该键所映射到的值。
 isEmpty()
测试此 dictionary 是否不存在从键到值的映射。
 keys()
返回此 dictionary 中的键的枚举。
 put(K key, V value)
将指定 key 映射到此 dictionary 中指定 value

remove(Object key)
从此 dictionary 中移除 key (及其相应的 value)。
 size()
返回此 dictionary 中条目(不同键)的数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值