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