黑马程序员技术交流社区

标题: 为什么HashSet无序不重复呢? [打印本页]

作者: 周刚    时间: 2012-6-30 18:53
标题: 为什么HashSet无序不重复呢?
为什么HashSet无序不重复呢?从hashCode地址的角度给解释一下
作者: wht    时间: 2012-6-30 19:00
 1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
 2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。
 3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样
作者: 王莹    时间: 2012-6-30 19:10

1:先说无序,HashSet是Set集合中的,这个集合特点就是无序的,它的结果取决于其内部的存储结构。
2.非重复性: HashSet可以保证元素唯一,是因为它通过父类继承的hashcode()和equals()方法判断元素的哈希值是否相同,相同就认为是重复的元素,不允许插入集合中。
作者: whocases    时间: 2012-6-30 19:27
表面上看HashSet集合里面的元素都是没有索引的,实际上当程序向HashSet集合中添加元素的时候,HashSet集合会根据这个元素的HashCode值来决定他的存储位置,所以从HashSet中访问元素的时候,HashSet先计算元素的HashCode值,也就是调用这个对象的HashCode()方法的返回值
作者: 赵志勇    时间: 2012-6-30 22:39
Set集合中对象是不按特定顺序排序,并且对象没有重复的.
而Set的一个实现类:HashSet是按照hash算法来存取集合中的对象的.hash是: 对象值-->哈希码-->元素位置
HashSet在保存数据的时候显然还是得按一定顺序放入其背后的数组中,但顺序不是用户可控制的,对用户来说就是“无序”。
我认为这个问题没必要太过理解,只要知道一些就可以了,你要是搞科研可以深入研究的。只是建议。

作者: 周朋飞    时间: 2012-7-1 04:11
首先我们来看一下hash算法的原理:哈希算法就是将你的集合分成若干个区域,每个对象可以计算出一个哈希码,可以讲哈希码分组,每组分别对应某个区域,根据哈希码就能知道你的对象时在哪一个区域里面的
然而呢 HashSet就是按照哈希算法来存取对象的集合,往里面放对象的时候他会判断集合里面有没有这个对象如果有就不让放
但是注意一点,你这个类的对象必须保证同时实现了Object的hashcode方法和equals方法,为什么呢 给你举个例子
Collection collection = new HashSet();
                    ReflectPoint p1 = new ReflectPoint(3,3);
                    ReflectPoint p2 = new ReflectPoint(4,5);
                    ReflectPoint p3= new ReflectPoint(3,3);
                    collection.add(p1);
                    collection.add(p2);
                    collection.add(p3);
这是一个hashset集合,本来我们应该把p1和p3看成是相等的是吧,但是我们打出来的集合的大小却是3
为什么呢 这就是为什么要覆盖Object的hashcode方法和equals方法了,因为他的返回值是通过
对象的内存地址推算出来的,同一个对象在运行期间的任何时候一返回的哈希值都是始终不变的,所以只要是两个不同的实例
对象,即使他们的equals方法比较结果相等。他们的默认hashcode方法 的返回值也是不同的

所以当我们重写equals方法的时候,判断两个对象啊为真,但是却还是打印结果为3,就是因为没有重写hashcode方法而是用的Object的hashcode方法,导致两个对象的
hashc值不一样 所以就能存进去了,所以这就是hashcode的作用在hashset中的作用,
因为有了hashcode方法,hashset中才不会出现元素的重复
只要记着:当你覆盖了equals方法的时候,一定要覆盖hashcode方法,不然即使你比较equals的方法相等,但还是hashcode值还是不一样额,必须保证equals方法的值为true时。
hashcode的值的比较野必须为true




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