以下Person对象如何存储在同一哈希存储桶中?作为链表?另外,根据Java 8,如果达到一定的网格,则将链表转换为树?这也正确吗?
class TestHashSet
{
public static void main (String[] args) throws java.lang.Exception
{
Person p1 = new Person("Mike");
Person p2 = new Person("Mike");
Set persons = new HashSet();
persons.add(p1);
persons.add(p2);
Iterator iterator = persons.iterator();
while (iterator.hasNext()) {
System.out.println("Value: "+((Person)iterator.next()).getName() + " ");
}
}
}
class Person {
String name;
String getName(){
return name;
}
Person(String name){
this.name = name;
}
public int hashCode(){
return name.hashCode();
}
public boolean equals(Object o){
return false;
}
}
答案 0 :(得分:2)
是的。冲突条目首先存储为链接列表,然后再存储 达到某个阈值之后成为树
答案 1 :(得分:0)
对于您的第一个问题,这两个对象将作为2个不同的条目存储在哈希集中。原因是equals方法返回的假值。
比较2个对象。首先,检查哈希码。由于找到了相同的哈希码,因此检查了equals方法,该方法返回false,因此再次存储了对象。
这里要注意的重要一点是,由于哈希码相同,因此它们进入相同的存储桶,但作为2个不同的条目(作为冲突的情况)。
对于第二个问题,从Java 8开始,在达到一定阈值后,出于目的,使用二叉树代替了链表。供参考,请检查https://www.nagarro.com/de/blog/post/24/performance-improvement-for-hashmap-in-java-8