java - HashSet 中有多少个唯一对象以及使用哪个方法检查唯一性等于或 hashCode

标签 java set hashset

<分区>

考虑下面的代码

import java.util.HashSet;
import java.util.Random;
import java.util.Set;


public class Test {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    Person p1= new Person();
    //Person p2= new Person();
    p1.setName("same1");
    //p2.setName("same2");
    Person p2=p1;
    Set<Person> set= new HashSet<Person>();
    set.add(p1);
    set.add(p2);
    for(Person p: set){
        System.out.println(set.size()+">>"+p.getName()+" hashcode "+p.hashCode());
    }


}

}

class Person{
private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public boolean equals(Object obj){
    return true;

}

@Override
  public int hashCode() {
    Random ran = new Random();
    int x = ran.nextInt(6) + 5;
    System.out.println("in hahcode method"+x);
    return x;
  }
}

由于集合不包含重复项,这里我从 equals 方法返回 true 并为同一对象返回不同的哈希码。 HashSet 将它们视为唯一对象。到目前为止一切顺利,因为 HashSet 在内部使用 HashMap 来存储对象。

从上面的代码片段可以看出,HashSet 使用 hashCode 来检查唯一性不等于方法。如果两个对象的hashCode不同,不管它们是否相等都会存入HashSet? 如果我遗漏了什么,请告诉我。

最佳答案

HashSet 的最大桶数可以包含(记住:它是引擎盖下的 HashMap)由其容量给出。 initialCapacity可以作为参数传递给构造函数,正如您在 documentation 中看到的那样, 这是一个 int .理论上最大桶数可以是Integer.MAX_VALUE - Java 中数组的最大大小,但实际上这是依赖于实现的,例如在 Oracle JDK 中它是 1 << 30 .

然而,一个HashMap每个桶可以包含多个元素,以防发生冲突,每个桶都会使用一个链表。所以原则上 HashSet 中的元素数量是未绑定(bind)的,只要有足够的内存可用于 JVM。

关于java - HashSet 中有多少个唯一对象以及使用哪个方法检查唯一性等于或 hashCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21555195/

相关文章:

java - 如何在Java中创建多个线程?

java - Java 是如何评价这个语句的呢?

java - BATTERY_PROPERTY_CURRENT_NOW 不适用于所有设备。什么是替代品?

set - Coq:FSet 和 MSet 有什么区别?

java - 如何从集合中获取元素?

python - 使用 Python 在更大的列表中查找兼容列表

java - HashSet 等于无法正常工作

使用 longs 的 HashSet 的 Java 代码不起作用?

Java - 覆盖 JFrame 的绘制时,JPanel 不会显示在 JFrame 上

java - HashSet addAll 方法修改类内部字段