gpt4 book ai didi

java - 具有自定义类型的 HashSet

转载 作者:行者123 更新时间:2023-12-01 08:00:44 29 4
gpt4 key购买 nike

我想知道为什么 HashSet 对自定义类型对象的行为很奇怪。在下面的 String 代码中,它总是给出不同的结果,但对于 Human 相同类型的排序结果。我的

equals or hashCode or compareTo ?

请帮助我理解。提前致谢。

bean :

public class Human implements Comparable<Human>
{
private int id;
private String name;
private int age;
// setters and getters
public Human(int id,String name,int age)
{
this.id = id;
this.name = name;
this.age = age;
}

@Override
public int hashCode()
{
return id;
}
@Override
public boolean equals(Object object)
{
if(object != null && object instanceof Human)
{
if(this.id == ((Human)object).getId())
{
return true;
}
}
return false;
}

@Override
public String toString()
{
String s = "id:"+this.id+":name:"+this.name+":age:"+age;
return s;
}

@Override
public int compareTo(Human human) {
if(this.id > human.getId())
return 1;
else if(this.id < human.getId())
return -1;
else
return 0;
}
}

代码:

System.out.println("HashSet");
Set<String> set1 = new HashSet<String>();
set1.add("3");
set1.add("1");
set1.add("2");
set1.add("4");

Iterator<String> iter1 = set1.iterator();
while(iter1.hasNext())
{
System.out.println(iter1.next());
}

System.out.println("HashSet with Custom Objects");

Set<Human> set11 = new HashSet<Human>();
set11.add(new Human(1, "joe", 26));
set11.add(new Human(3, "leo", 109));
set11.add(new Human(2, "king", 18));
set11.add(new Human(0, "vkgentle", 10));

Iterator<Human> iter11 = set11.iterator();
while(iter11.hasNext())
{
System.out.println(iter11.next().toString());
}

输出:

HashSet
3
2
1
4
HashSet with Custom Objects
id:0:name:vkgentle:age:10
id:1:name:joe:age:26
id:2:name:king:age:18
id:3:name:leo:age:109

最佳答案

没有任何东西损坏。您获得排序结果的原因是您的自定义 hashCode 方法没有非常随机的 hash distribution .

HashSet 类由“桶”数组支持。当您向 HashSet 添加内容时,它会使用您的 hashCode 方法来确定要使用哪个存储桶。我认为它的工作原理是这样的:

bucketIndex = object.hashCode() % arrayLength;

由于您的 hashCode() 只是 ID,因此您最终会将人类按顺序添加到存储桶中。如果您对哈希函数进行了一些修改,以使其更加随机分布,那么您应该在 HashSet 中获得更加随机的排序。

关于java - 具有自定义类型的 HashSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25469115/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com