黑马程序员技术交流社区

标题: set集合问题 [打印本页]

作者: \(^o^)/    时间: 2014-4-29 15:50
标题: set集合问题
set集合是无序的且不能重复,但毕老师的视频在讲到hashset的时候举了个例子是把一堆人存到集合中,然后是相同姓名和年龄的人视为同一个人 ,怎么实现只存一个进来,但是set集合本身不就具备不重复性吗?在这块的话却不能实现。这与set集合是唯一性不造成冲突了吗?
作者: Kelvinhu    时间: 2014-4-29 16:07
实现set接口的集合本身是无序且不包含重复元素

hashset保证唯一性是这样来实现的:

先判断hashCode是否相同,如果相同,则用判断eqults方法继续判断,如果不同,那么这就可以添加到集合中了。
作者: 神马    时间: 2014-4-29 16:22
set的定位的确是无序的且不能重复,这点没有疑问。但是set集合实现唯一性是依靠调用对象本身的hashcode()以及equals()方法,(楼上equals不小心拼错了)。毕老师的视频里,因为Object类自带hashcode()以及equals()方法,所以person类如果没有重写这两个方法,就继承了Object类中的方法。而Object类中的hashcode()方法是这样定义的public native int hashCode();这是调用系统底层的hash算法,依照它的算法即使姓名和年龄相同,哈希值也不同。所以要实现唯一性,一般我们都要重写hashcode()以及equals()方法。方法的具体实现视频里有。
作者: skill20    时间: 2014-4-29 17:44
本帖最后由 skill20 于 2014-4-29 17:46 编辑

 HashSet:底层数据结构是哈希表,线程是不同步的。无序,高效;                    HashSet集合保证元素唯一性:通过元素的hashCode方法,和equals方法完成的。
                  当元素的hashCode值相同时,才继续判断元素的equals是否为true。
                  如果为true,那么视为相同元素,不存。如果为false,那么存储。
                     如果hashCode值不同,那么不判断equals,从而提高对象比较的速度。







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