黑马程序员技术交流社区

标题: HashSet操作过程的疑问 [打印本页]

作者: 黑马_张佳超    时间: 2012-6-19 16:37
标题: HashSet操作过程的疑问
本帖最后由 黑马_张佳超 于 2012-6-20 11:53 编辑

将相同元素添加到HashSet集合,后添加的元素是将先添加的元素覆盖,还是原集合中的元素不变,后添加的元素被集合拒绝?
作者: 车风波    时间: 2012-6-19 16:42
本帖最后由 车风波 于 2012-6-19 16:52 编辑

是原集合中的元素不变,后添加的元素被集合拒绝。
我给你举个例子证明:

作者: 陆强强    时间: 2012-6-19 16:43
Hashset是依据哈希值来判断两个元素是否是一个元素,如果两个元素的哈希值一样,会调用equals方法比较两个元素的内容是否一样,
一样则视为一个元素,添加失败
作者: 孙峰    时间: 2012-6-19 16:44
本帖最后由 孙峰 于 2012-6-19 16:48 编辑

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

    如果元素没有实现hashCode的话,比如这个情况, String str1="abc",String str2="abc",这时候str1和str2都是可以存进去的。
作者: 余银桂    时间: 2012-6-19 16:50
hashSet添加一个对象先调用它的hashCode()得到这个对象的hashcode,放入hashSet中这个hashcode值的一个位置,如过添加的下一个对象的hashcode已经在hashSet中存在,就和这个位置上的其他对象用equals()比较,如果没有相同的对象就放入hashSet的这个位置。
作者: 耿鑫    时间: 2012-6-19 16:53
你这个问题其实查下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;
作者: 黑马_张佳超    时间: 2012-6-19 16:55
谢谢各位耐心的帮助,以后有不懂的问题,还跟大家请教~{:soso_e100:}
作者: 邓杰    时间: 2012-6-19 16:58
简单的你看返回值不就知道了;成功是true 失败是false,false就是表示未添加成功;
也可以自定义一个equals方法。验证一下就可以了;
作者: 杨康    时间: 2012-6-19 17:36
后添加的元素假如被hashCode方法和equals方法判定为同一元素,视为原集合中已经存在该元素,根据HashSet集合的判断,不能重复元素,故该新添加的元素会被拒绝添加,不会覆盖原集合。个人理解。
作者: 逝去的记忆ヽ    时间: 2012-6-19 22:23
我画了一个图,来回答你的问题。

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

hashcode添加相同元素.png

作者: 常佳杰    时间: 2012-6-20 00:15
哥们看看一楼举的例子很经典...
Set集合中的对象不按特定方式排序,并且没有重复对象,
当你添加一个重复元素,它就会调用hashcode()方法在里边遍历,找是不是有相同元素,
要是有就不添加进去,要是没有就添加....

建议提问前多在前边那些几期里边找些资料看看,都挺经典的,也是个很好的学习平台




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