【发布时间】:2021-12-23 03:00:14
【问题描述】:
在 main 方法中,我创建了两个不同的相等对象。
private static Set<Cards> allCombs = new HashSet<>();
cards = new Cards();
cards.add(new Card(1, 10));
cards.add(new Card(1, 12));
Cards cards2 = new Cards();
cards2.add(new Card(1, 10));
cards2.add(new Card(1, 12));
System.out.println(cards.toString() + " " + cards2.toString() + " " + (cards == cards2) + " " + cards.equals(cards2));
allCombs.add(cards);
allCombs.add(cards2);
System.out.println(allCombs);
我的期望是集合 allCombs 有一个元素,因为 Cards 的两个对象是相等的。我检查了它,DEBUG 来自equals 方法并且对象相等(来自println 的比较)。但它们不是同一个参考...
为什么HashSet中的add方法在添加元素时不调用Cards的equals方法?
DEBUG 6_QT 6_QT true
6_QT 6_QT false true
[6_QT, 6_QT]
【问题讨论】:
-
您是否也覆盖了
Card中的hashCode? -
我看到你也有一个类
Cards,所以你也需要在那里覆盖hashCode -
您使用的是
HashSet,顾名思义,使用hashCode来确定相等性。此外,您应该始终覆盖equals和hashCode以保持合同一致 -
我认为超类(对象)中的 hashCode 会相等你为什么这么认为?
-
@TomaszEkner - 用于
Object::equals和Object::hashCode的javadocs 解释了这两种方法之间所需的关系。当您覆盖这些方法中的任何一个时,必须保持这种关系(也就是哈希码 等于合同)......否则您的哈希表将表现不正确。
标签: java set add equals hashset