您的位置:首页 > 其它

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

2015-02-03 16:25 344 查看
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 中条目(不同键)的数量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息