Java hashset中的contains方法是如何工作的?

Java hashset中的contains方法是如何工作的?,java,collections,set,contains,hashset,Java,Collections,Set,Contains,Hashset,contains方法如何确定某个对象是否在HashSet中?我创建了一个包含两个实例变量的类。然后,我将几个实例放入哈希集中。我再次创建了相同的实例(使用相同的实例变量值),并将它们用作contains方法的输入。虽然是相同的对象,但每次“contains”都返回false。 所以,我想知道是只检查了引用还是对象的值。如果我必须使用相同的对象,并将其中一个对象放入HashSet,然后用另一个对象调用“contains”方法,那么该方法会返回true还是false? 如果为false,我必须做什么

contains方法如何确定某个对象是否在HashSet中?我创建了一个包含两个实例变量的类。然后,我将几个实例放入哈希集中。我再次创建了相同的实例(使用相同的实例变量值),并将它们用作contains方法的输入。虽然是相同的对象,但每次“contains”都返回false。 所以,我想知道是只检查了引用还是对象的值。如果我必须使用相同的对象,并将其中一个对象放入HashSet,然后用另一个对象调用“contains”方法,那么该方法会返回true还是false?
如果为false,我必须做什么才能返回true?

当多个对象相同时,它们是否匹配取决于equals()和hashCode()的实现方式。例如,对于类A,每个对象都是相同的,因为它只有一个最终字段设置为常量

public static class A {
    final int a=2;
}
但哈希集将包含一个视为包含另一个:

 A a1 = new A();
 HashSet<A> hsA = new HashSet<>();
 hsA.add(a1);
 A a2 = new A();
 System.out.println("hsA.contains(a2) = " + hsA.contains(a2));
运行几乎相同的代码:

    B b1 = new B();
    HashSet<B> hsB = new HashSet<>();
    hsB.add(b1);
    B b2 = new B();
    System.out.println("hsB.contains(b2) = " + hsB.contains(b2));
b1=新的B();
HashSet hsB=新的HashSet();
hsB.add(b1);
b2=新的B();
System.out.println(“hsB.contains(b2)=”+hsB.contains(b2));
产生不同的值。输出为:

hsA.contains(a2)=假
hsB.contains(b2)=真


大多数IDE都有生成hashCode()和equals()的选项,因此对象是否匹配完全取决于您指定的字段。

这是什么语言?Java?文档告诉您在散列集的特定情况下,
的合同包含
。它告诉你它如何认为两个对象是同一个键。哦,是的,对不起。它是JAVA。如果将自定义类的实例存储在
HashSet
(或任何
Set
)中,请确保正确重写该类中的
equals
hashCode
方法。否则,只有当
集中的两个对象是同一个对象(
==
)时,才认为它们是相等的
    B b1 = new B();
    HashSet<B> hsB = new HashSet<>();
    hsB.add(b1);
    B b2 = new B();
    System.out.println("hsB.contains(b2) = " + hsB.contains(b2));