黑马程序员技术交流社区

标题: HashMap、HashSet、Hashtable的区别与联系 [打印本页]

作者: 李振元    时间: 2011-12-10 12:24
标题: HashMap、HashSet、Hashtable的区别与联系
本帖最后由 李振元 于 2011-12-10 18:09 编辑

请问一下HashMap、HashSet、Hashtable的区别与联系
作者: 李明    时间: 2011-12-10 12:50
Hashtable:底层数据结构是哈希表,不能存null,线程同步。出现与jdk1.0版本,效率低
HashMap:底层数据结构是哈希表,能存null值,线程不同步。出现与jdk1.2版本,效率高
HashSet:底层数据结构是哈希表,元素无序,不同步。

作者: 侯伟浩    时间: 2011-12-10 12:57
HashMap、HashSet、Hashtable:
相同点
   1.都是不允许重复的集合;
   2.都是根据hash码判断是否相同的。
不同点
   1.HashMap和Hashtable属于Map集合,是双值集合;
   2.HashSet属于Set接口
作者: 颜秉武    时间: 2011-12-10 13:16
HashSet
                存储原理
                        每次存储对象的时候, 调用该对象的hashCode()方法得到哈希值, 在集合中查找是否有哈希值相同的对象.
                        如果没有哈希值相同的对象, 直接存入.
                        如果有哈希值相同的对象, 则和哈希值相同的对象进行equals()比较.
                        比较结果为false直接存入, 结果为true则不存.
                过滤属性相同元素
                        如果我们希望HashSet能够过滤属性重复的元素, 那么就需要重写hashCode()和equals().
                        属性相同的对象hashCode()方法要返回同一个哈希值, 属性相同的对象equals()方法要返回true.
                        为了提高效率, hashCode()方法在属性不同的时候尽量返回不同的哈希值.

HashMap (线程不安全,存取速度快,允许存放null键,null值。)
在每次存储键值对的时候, 调用Key对象的hashCode()方法计算一个哈希值. 在集合中查找是否有哈希值相同的Key对象.
                如果没有哈希值相同的Key对象就直接存入键值对.
                如果有哈希值相同的Key对象, 那么和这些相同的Key对象进行equals()比较.
                比较结果为false就直接存入, 比较结果为true则将Value对象覆盖.

Hashtable
线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。


作者: 李振元    时间: 2011-12-10 15:52
颜秉武 发表于 2011-12-10 13:16
HashSet
                存储原理
                        每次存储对象的时候, 调用该对象的hashCode()方法得到哈希值, 在集合中查找是否有哈 ...

多谢回复!解释的非常清楚,好理解!
作者: 李振元    时间: 2011-12-10 15:53
李明 发表于 2011-12-10 12:50
Hashtable:底层数据结构是哈希表,不能存null,线程同步。出现与jdk1.0版本,效率低
HashMap:底层数据结构 ...

非常感谢您的回复!
作者: 李振元    时间: 2011-12-10 15:53
侯伟浩 发表于 2011-12-10 12:57
HashMap、HashSet、Hashtable:
相同点
   1.都是不允许重复的集合;

多谢回复!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2