对象引用和对象显示不同的结果

时间:2013-05-31 06:55:11

标签: java collections hashset

我对这些概念和非常天真的用户都很陌生,所以请原谅我提出以下问题,但是

我试图理解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

由于

7 个答案:

答案 0 :(得分:2)

  

当它具有相同的对象引用

时,为什么最后一个为false

没有。您已经创建了一个 new 对象,该对象恰好具有age的相同值。

这就像要求建筑工人为你建造两栋有5间卧室的房子。是的,他们看起来一样 - 但他们是不同的房子,地址不同。

现在HashSet实际上不适用于相等的引用 - 它检查相等的对象 - 其中通过hashCode和{确定相等性{1}}方法。默认情况下,这会检查引用标识,但不是必须的。因此,如果您覆盖equalsequals以确定只有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相比有所不同。