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.Objectjava.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 中条目(不同键)的数量。 |