我对这些概念和非常天真的用户都很陌生,所以请原谅我提出以下问题,但是
我试图理解java中集合的基本概念
我做了以下课程
package com.vish;
public class HashSetDemo {
private int age;
public HashSetDemo(int age) {
this.age = age;
}
}
现在我已经设置了以下类
中描述的集合框架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
当它具有相同的对象引用
时,为什么最后一个为false由于
答案 0 :(得分:2)
当它具有相同的对象引用
时,为什么最后一个为false
没有。您已经创建了一个 new 对象,该对象恰好具有age
的相同值。
这就像要求建筑工人为你建造两栋有5间卧室的房子。是的,他们看起来一样 - 但他们是不同的房子,地址不同。
现在HashSet
实际上不适用于相等的引用 - 它检查相等的对象 - 其中通过hashCode
和{确定相等性{1}}方法。默认情况下,这会检查引用标识,但不是必须的。因此,如果您覆盖equals
和equals
以确定只有hashCode
值的相等性,那么它会认为您的新对象等于旧对象。
age
答案 1 :(得分:1)
因为您的equals()
课程尚未实施HashSetDemo
。如果你不这样做,那么java无法弄清楚如何判断两个对象是否相等。它确实有一个默认的实现,并且默认实现是询问“这两个对象是否是相同的引用?”
由于您明确创建了新的HashSetDemo
,因此Java使用默认的equals()
并说“不,这些不是HashSetDemo
的实例”
答案 2 :(得分:0)
因为您没有为您的类提供自定义equals和hashCode方法。您的类使用Object提供的实现。
如果你覆盖等于return this.age == ((HashSetDemo)other).age
并覆盖hashCode以返回从age派生的哈希值,那么你对hashset.contains的最后一次调用将返回True。
答案 3 :(得分:0)
它的参考不一样。在第二种情况下,您正在创建HashSetDemo
的新实例,并且在内存中具有不同的地址。
您的HashSet
正在使用默认比较器进行搜索,并比较对象的实例,而不是内容。
答案 4 :(得分:0)
当它具有相同的对象引用
时,为什么最后一个为false
即使对象完全相同,它们也不是同一个对象。这就像把一辆全新的自行车放在车库里,让另一辆全新的自行车与另一辆完全一样,并询问车库是否包含第二辆自行车。当然,自行车可能相等,但它们不是相同的。
顺便说一下,好的问题。答案 5 :(得分:0)
您需要在HashSetDemo中覆盖equals()和hashCode()。这告诉您的程序如何确定2个单独的实例是否相等。如果不这样做,程序将回退到默认实现,该实现仅检查对象引用。在你的第三行中,对象是等价的,但Java不知道 - 它只知道它是一个不同的引用。
答案 6 :(得分:0)
在最后一种情况下,您创建了new Object
new HashSetDemo(23)
它将存储在java heap memory
的不同位置。与其他两个对象hsd and hsd1
相比有所不同。