问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

HashSet中的元素可相同,怎么回事?

发布网友 发布时间:2022-05-13 19:46

我来回答

3个回答

热心网友 时间:2023-10-23 19:11

HashSet 比较两个对象是否相同的机制是 1.hash 2. == 3.equals()
第一步就是比较两个对象的hash值是否相同(注意这里的hash值是经过处理的,为了使散列更均匀)

hash值相同的就会散列到一组 不相同就会散列到不同的组(此时就不会再继续比较了,因为在不同组hashset认为他们就是不同的对象)

第二步 如果hash值相同 则进行连等判断 即比较内存地址是否相同 如果不相同那么hashset就认为他们肯定不是相同的对象 如果内存地址相等(这一步最主要的目的其实就是删除元素的时候判断)那么进行第三步

第三步 如果equals返回相同 那么他们就是彻彻底底的相同的对象 不能添加到set里,如果返回不同那么他们就不是彻底的不相同 就可以添加到一个set里追问那要怎么改,才能得出正确的结果?

热心网友 时间:2023-10-23 19:11

hset两次添加的hs1的hashCode值不一样, hset会根据hashCode值把两个hs1存储在hash表不同的位置
import java.util.HashSet;

public class TestHashSet {

public static void main(String[] args) {
HashSet<String> hs1 = new HashSet<String>();
HashSet<HashSet<String>> hset = new HashSet<HashSet<String>>();
hs1.add("string");
hset.add(hs1);
System.out.println("hs1 hashcode: " + hs1.hashCode());
System.out.println("hset前:" + hset);
hs1.add("string");
hs1.add("same");
hset.add(hs1);
System.out.println("hs1 hashcode: " + hs1.hashCode());
System.out.println("hset后:" + hset);
}
}
输出:
hs1 hashcode: -891985903
hset前:[[string]]
hs1 hashcode: -888463241
hset后:[[string, same], [string, same]]
之所以hset输出结果中的第一个元素和第二个元素好像是一样的,那是因为hset第一次添加的元素持有hs1的引用,多hs1的修改(添加,删除)会影响hset第一次添加的元素的值,但第一次添加的元素的hash位置是不会变的. 这里隐藏一个问题就是当达到hashSet的负载因子0.75时,它会重新放置元素,这个时候会出现同一个hash位置放两个相同的元素,肯定会报错.建议写法如下:

import java.util.HashSet;

public class TestHashSet {

public static void main(String[] args) {
HashSet<String> hs1 = new HashSet<String>();
HashSet<HashSet<String>> hset = new HashSet<HashSet<String>>();
hs1.add("string");
hset.add(new HashSet<String>(hs1));
System.out.println("hset前:" + hset);
System.out.println(hs1.hashCode());
hs1.add("string");
hs1.add("same");
hset.add(new HashSet<String>(hs1));
System.out.println(hs1.hashCode());
System.out.println("hset后:" + hset);
}
}
输出:

hset前:[[string]]
-891985903
-888463241
hset后:[[string], [string, same]]

热心网友 时间:2023-10-23 19:11

ASAS是AAAsS阿aS
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
硅胶与液态硅胶手机壳的区别 什么样的过敏会传染 过敏的原理是什么?为什么有的人过敏,有的人不过敏?谢谢! 过敏为什么会痒 评审报告需要注意什么 财政评审流程及注意事项 高效项目评审的6大注意事项 银行双录 什么意思 什么是银行双录 在异地哪些可公证 类风湿病已经4年多了,还能治好不? 地贫基因检测结果女方的:a-地中海贫血基因型分析(缺失型):未检测出以上三种a-地中海贫血基因缺失 木霉与漆酶 昆仑关战役的战役后期(宾阳作战) 我想装个联通的宽带,用来看电视,多少M的合适啊? 房贷提前还款需什么手续 看网络电视最少需要多少兆的宽带。有好评 办多少兆宽带才能看网络电视一点也不卡? 赤壁赋中盛赞曹操文韬武略的英雄气概句子 喜欢文艺最后却文韬武略怎么安慰他人? “万家灯火阑珊处”的下一句是什么? 白马啸西风里有一句台词:这个人,文韬武略,有勇有谋,乃当今不世之才,可我就是不喜欢?谁说的?他 文韬武略的意思 文武兼备下一句 文采飞扬下一句怎么接下去 据说伦敦同一条街有甲乙丙三个裁缝,他们都挂出了一张招牌。甲的招牌是,伦敦最好的裁缝。乙的是,英国最 有人撰鸟诸葛亮和孙悟空的一副对联,上联 识天文地理,通文韬武略,神杌妙算,羽扇轻摇操胜券。下联 苏家后代.文韬武略.精忠报国.这句子含接吗? 在伦敦的同一条街上住着三个裁缝 求一副结婚用的对联 上联:文——李 下联:斌——雪 我的检查报告 hbf2.5% hb未见异常hb带 hba26.1% 请问是不是地中海贫血 我的女朋友1、a-地中海贫血(a-DP) Gap-PCR a珠蛋白基因缺实 aa&#47;aa, _百度问一问 荨麻疹一年半了,现在吃药减量中有时复发有关系吗 mip.haodf.com 异大陆玄幻魔法小说全本要小弟多多 缺少restr.dll文件怎么办 2015年秋季庐江县中小学教师资格认定通过公示在哪个网站查询 安徽省庐江县的初中教师资格证书一年可以考几次?是两次吗? 人事档案在庐江 工作在合肥 在哪里认定教师资格 我想问一下,在淘宝店铺上自定义区怎样同时添加两个海报, 就是说,同一个自定义上能添加两个海报的那种 怎么考取庐江先教师资格证?还有什么时候报名?我是非师范专业,现在想要考,不知要看什么书。。谢谢。。 微一案WDS微商系统还可以自定义海报吗? 如何利用PS里的自定义工具里的图案来做一个简单的海报图? 集成环保灶会不会成为厨房油烟处理设备主流产品呀? 求个电子商务专业个人简历模板 要word编写的 有的发我邮箱517419975@qq.com 要非常正规的 写得好加分多 电子商务专业的个人简历模板谁有,发给我185703194@qq.com 求一首纯音乐bgm旋律是 噔噔,噔噔噔,蹬蹬蹬,蹬蹬蹬 大概这样重复的,轻快节奏感很强 面试说离职原因可以说家里原因吗 面试官问我家中有什么事离职时 该怎么回答 如果你的同事突然离职,你会认为是他家里出了变故还是自己出了意外?