A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© \(^o^)/ 中级黑马   /  2014-4-29 15:50  /  1404 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

set集合是无序的且不能重复,但毕老师的视频在讲到hashset的时候举了个例子是把一堆人存到集合中,然后是相同姓名和年龄的人视为同一个人 ,怎么实现只存一个进来,但是set集合本身不就具备不重复性吗?在这块的话却不能实现。这与set集合是唯一性不造成冲突了吗?

3 个回复

倒序浏览
实现set接口的集合本身是无序且不包含重复元素

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

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

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 skill20 于 2014-4-29 17:46 编辑

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


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马