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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马_张佳超 中级黑马   /  2012-6-19 16:37  /  2717 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马_张佳超 于 2012-6-20 11:53 编辑

将相同元素添加到HashSet集合,后添加的元素是将先添加的元素覆盖,还是原集合中的元素不变,后添加的元素被集合拒绝?

10 个回复

倒序浏览
本帖最后由 车风波 于 2012-6-19 16:52 编辑

是原集合中的元素不变,后添加的元素被集合拒绝。
我给你举个例子证明:
回复 使用道具 举报
Hashset是依据哈希值来判断两个元素是否是一个元素,如果两个元素的哈希值一样,会调用equals方法比较两个元素的内容是否一样,
一样则视为一个元素,添加失败
回复 使用道具 举报
本帖最后由 孙峰 于 2012-6-19 16:48 编辑

        如果一个元素实现了hashCode 和equals方法,当该对象往集合里存时,先比较hash值,如果值不同,则存入。  若值相同的话 在比较equals的值,还是相同时,就不存入,不是覆盖。 若equals值不同,说明还是两个不同的对象,就在相同hash值的存储位置下方开辟一段新的内存空间。

    如果元素没有实现hashCode的话,比如这个情况, String str1="abc",String str2="abc",这时候str1和str2都是可以存进去的。
回复 使用道具 举报
hashSet添加一个对象先调用它的hashCode()得到这个对象的hashcode,放入hashSet中这个hashcode值的一个位置,如过添加的下一个对象的hashcode已经在hashSet中存在,就和这个位置上的其他对象用equals()比较,如果没有相同的对象就放入hashSet的这个位置。
回复 使用道具 举报
你这个问题其实查下API就知道了  HashSet的add的解释是这样的:If this set already contains the element, the call leaves the set unchanged and returns false.   内容是不会变的,

public class HashSetTest
{
        public static void main(String[] args)
        {
                HashSet<String> hs = new HashSet<String>();
               
                System.out.println(hs.add("a"));
                System.out.println(hs.add("a"));
        }
}

执行结果是true 和 false;
回复 使用道具 举报
谢谢各位耐心的帮助,以后有不懂的问题,还跟大家请教~{:soso_e100:}
回复 使用道具 举报
邓杰 中级黑马 2012-6-19 16:58:10
8#
简单的你看返回值不就知道了;成功是true 失败是false,false就是表示未添加成功;
也可以自定义一个equals方法。验证一下就可以了;
回复 使用道具 举报
杨康 中级黑马 2012-6-19 17:36:24
9#
后添加的元素假如被hashCode方法和equals方法判定为同一元素,视为原集合中已经存在该元素,根据HashSet集合的判断,不能重复元素,故该新添加的元素会被拒绝添加,不会覆盖原集合。个人理解。
回复 使用道具 举报
我画了一个图,来回答你的问题。

hashcode添加相同元素.png (41.88 KB, 下载次数: 19)

hashcode添加相同元素.png
回复 使用道具 举报
哥们看看一楼举的例子很经典...
Set集合中的对象不按特定方式排序,并且没有重复对象,
当你添加一个重复元素,它就会调用hashcode()方法在里边遍历,找是不是有相同元素,
要是有就不添加进去,要是没有就添加....

建议提问前多在前边那些几期里边找些资料看看,都挺经典的,也是个很好的学习平台
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马