黑马程序员技术交流社区

标题: 有关HashSet问题 [打印本页]

作者: ╄Tracyぺ    时间: 2014-5-14 17:59
标题: 有关HashSet问题
本帖最后由 ╄Tracyぺ 于 2014-5-15 23:54 编辑

HashSet是如何保证元素的唯一性的
作者: 苍穹的雨    时间: 2014-5-14 18:23
HashSet集合中有若干个存储区域,而每个对象可以计算出一个hash码,系统自动将hash码分组,对应若干个存储区域。当添加新元素时,系统会将该元素与该元素的hash码对应的存储区域的每一个元素进行比较,如果不相同则添加该元素。
简单说就是会先调用对象的hashCode方法,如果集合中的其他对象的hash码跟该对象不同,则将该元素存入集合;如果hashCode方法的返回值相同,再调用equals方法进行比较,如果equals值不相同,则将该元素存入集合。
作者: 苗润    时间: 2014-5-14 19:15
其实中间还有 == 判断参与了
作者: 土突突    时间: 2014-5-14 23:31
首先,会根据你欲存对象所属类的相关 hashCode( )方法计算出即将存进集合的对象的hash值。若在该hash值上没有被占用,则直接把该对象存入。若有对象占用,则继续调用欲存对象的equals( ) 方法来比较这两个对象是否相等。若不等则存进。若相等则不存。
因此我们可以在自己定义的类中通过重写继承自Object类的hashCode( )方法和equals( ) 方法来自己规定什么是重复元素。已达到与现实更加接近的效果。
作者: jsjchenlong    时间: 2014-5-15 08:18
是通过hashCode()方法,因为应为hashset集合存储数据的形式是存储和读取的顺序不一致(注意),并不是真的无序,hashset集合里的方法会利用它里面的属性值还有你存入的值进行计算出一个hash值,然后通过这个hash值来进行存储数据到hashset集合指定的区域,那么这个指定的区域是hashset根据自己的属性值进行划分的,所以你在查找hashset里的值时,他也是通过hash值来进行判断从哪个区域去找,而不是挨个找,所以记得你自己定义的类重写了hashcode方法时,不要去修改这个类里的属性值,因为这样会影响hash值。




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