我对这些概念很陌生,而且用户非常天真,所以请原谅我提出以下问题,但是
我正在尝试了解java中集合的基本概念
我做了以下类(class)
package com.vish;
public class HashSetDemo {
private int age;
public HashSetDemo(int age) {
this.age = age;
}
}
现在我在下面的类(class)中描述了集合框架
package com.vish;
import java.util.HashSet;
public class HashSetDemo1 {
public static void main(String args[]) {
HashSetDemo hsd = new HashSetDemo(23);
HashSetDemo hsd1 = new HashSetDemo(24);
HashSet<HashSetDemo> hashset = new HashSet<HashSetDemo>();
hashset.add(hsd);
hashset.add(hsd1);
System.out.println(hashset.size());
System.out.println(hashset.contains(hsd));
System.out.println(hashset.contains(new HashSetDemo(23)));
}
}
现在的输出如下
2
true
false
为什么最后一个是假的,当它具有相同的对象引用时
谢谢
最佳答案
Why is the last one false,when it has the same object reference
事实并非如此。您创建了一个新对象,该对象恰好具有相同的age
值。
这就像要求建筑商为您 build 两栋有 5 间卧室的房子。是的,它们看起来一样 - 但它们是不同的房子,地址不同。
现在,HashSet
实际上并不支持相等的引用 - 它会检查相等的对象 - 其中相等性是通过 hashCode 确定的
和 equals
方法。默认情况下,这会检查引用身份,但并非必须如此。因此,如果您重写 equals
和 hashCode
来确定您的 age
值相等,那么它会认为您的新对象等于旧对象。
public final class HashSetDemo {
private final int age;
public HashSetDemo(int age) {
this.age = age;
}
@Override public int hashCode() {
return age;
}
@Override public boolean equals(Object other) {
if (!(other instanceof HashSetDemo)) {
return false;
}
HashSetDemo otherDemo = (HashSetDemo) other;
return age == otherDemo.age;
}
}
关于java - 对象引用和显示不同结果的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16851437/