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

标签 java collections hashset

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

我正在尝试了解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 方法。默认情况下,这会检查引用身份,但并非必须如此。因此,如果您重写 equalshashCode 来确定您的 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/

相关文章:

java - 如何修复 org.springframework.beans.factory.BeanCreationException

java - 同步块(synchronized block)中的 HashMap 与 Collections.synchronizedMap() 之间有什么区别?

java - Spring Boot中自动将HashSet转换为串联字符串

c# - 更新哈希集中的项目

java - 如何从已实现的集合中获取随机元素?

java - 拒绝 OS X 系统关闭

java - 编码Base64找不到符号错误

java - 有没有办法在我的测试自动化套件目录中自动更新 chromedriver?

java - 按对象的两个字段排序。 java

Java LinkedHashSet remove(Object obj) 方法常量/线性时间复杂度?