HashSet内部存储相同的哈希桶

时间:2018-07-25 07:19:45

标签: java hashset

以下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;
    }
}

2 个答案:

答案 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