当前位置: 首页 > 知识库问答 >
问题:

对象==对象,不比较引用

巴照
2023-03-14

我已经被覆盖了hashcode和equals以查找具有相同开始日期和关闭日期的值。我得到了重复对象的类似哈希代码。当等同于这些对象时,我得到了布尔值“假”。在我的理解中,对象==对象比较对象的引用,即使引用是相同的;代码返回假。你能帮我理解是什么问题吗?我在下面发布了我的代码:

public int hashCode() {
    final int prime = 31; 
    int result = 1;
    result = prime * result + ((this.startDate == null) ? 0 : this.startDate.getDate());
    result = prime * result + ((this.closingDate == null) ? 0 : this.closingDate.getDate());
    return result;
}

public boolean equals(Object customer) {
    if(customer == null || customer.getClass()!= this.getClass())
        return false;

    return this==customer;
}

Main.java

public class HashQuestion {
    public static void main(String[]args) {
        Map<Integer, Customer> custMap = new HashMap<Integer, Customer>();
        custMap.put(1, createCustomer(1, new Date()));
        custMap.put(2, createCustomer(2, new Date()));
        custMap.put(3, createCustomer(3, new Date()));
        Customer checkCustomer = createCustomer(1, new Date());
        for (Customer cust : custMap.values()) {

            if (cust.equals(checkCustomer)) {
                System.out.println("Duplicate No: "+cust.getCustId()+ ", Start date: " + 
                        cust.getStartDate().toString() + " End date: " +cust.getClosingDate().toString());
            }
            else
                System.out.println("No: "+cust.getCustId()+ ", Start date: " + 
                    cust.getStartDate().toString() + " End date: " +cust.getClosingDate().toString());
        } 
    }

    @SuppressWarnings("deprecation")
    static Customer createCustomer(int number, Date date) {
        Date closeDate = new Date(); 
        Date startDate = new Date(); 
        closeDate.setDate(date.getDate() + number);
        startDate.setDate(date.getDate() - number);
        return new Customer(number, number+1, startDate, closeDate);
    }
}

输出:

No: 1, Start date: Wed Jun 20 19:42:46 IST 2018 End date: Fri Jun 22 19:42:46 IST 2018
No: 2, Start date: Tue Jun 19 19:42:46 IST 2018 End date: Sat Jun 23 19:42:46 IST 2018
No: 3, Start date: Mon Jun 18 19:42:46 IST 2018 End date: Sun Jun 24 19:42:46 IST 2018

检查客户对象引用:Customer@643

对象引用(位于Map中):[Customer@643, Customer@625, Customer@607]

这里的object1与checkCustomer obj具有相同的引用。然而obj==checkCustemer,返回false。

共有3个答案

韦知
2023-03-14

您正在通过创建两个不同的对象

return new Customer(number, number+1, startDate, closeDate);

所以比较必须是错误的。如果要比较对象的属性,则必须在equals方法中实现它。

它应该看起来更像这样:

public boolean equals(Object customer) {
    if(customer == null || customer.getClass()!= this.getClass())
        return false;

    return this.getCustId()==customer.getCustId();
}
葛炯
2023-03-14

如果您创建一个 NEW 对象(使用“new”),则对象在堆中将始终具有不同的地址,因此,如果您比较它们,== 将始终返回 false。

例如

Integer i1 = new Integer(1);
Integer i2 = new Integer(1);

i1.equals(i2) --> true
i1 == i2 --> false

在最后一行的equals方法中,你做了一个引用比较(==),这是你永远不应该在对象中做的(只在原语和枚举中)。如果您使用的是IDE(例如eclipse ),您可以使用标识对象实例的字段来生成equals和hashcode方法。

高吉星
2023-03-14

从此更改:

Map<Integer, Customer> custMap = new HashMap<Integer, Customer>();
custMap.put(1, createCustomer(1, new Date()));
custMap.put(2, createCustomer(2, new Date()));
custMap.put(3, createCustomer(3, new Date()));
Customer checkCustomer = createCustomer(1, new Date()); //This is a different reference

对此:

Map<Integer, Customer> custMap = new HashMap<Integer, Customer>();
Customer checkCustomer = createCustomer(1, new Date());
custMap.put(1, checkCustomer); //Now this is the same reference
custMap.put(2, createCustomer(2, new Date()));
custMap.put(3, createCustomer(3, new Date()));

您正在创建4个不同的客户,这将创建3个。

 类似资料:
  • 问题内容: 我得到的错误就在这行 。 该怎么办?其他逻辑还可以吗? 我想做的是有一个A列表和一个B列表,其中一个属性与id相同;尽管变量名不同。即在和在B。现在我将两个列表都放在ListAll中,并在相同的变量id / bid上对它们进行排序。我有A和B实现可比性。 和我的listAll是对象类型? 我该怎么做?谢谢。 问题答案: 您可以添加一个通用基类并在那里进行比较,如下所示:

  • 我正在尝试创建一个二进制搜索程序,该程序可以使用各种类型的变量(int、float、string等)来查看数组中是否存在元素。我正试图找出如何比较变量。下面是我正在使用的内容的草图: 我甚至不确定使用对象是否是最好的方法。

  • 问题内容: 我必须将对象与预定义类的列表进行比较。 使用安全还是应该使用? 注意: 我不能使用,我没有对象,我只有对象。在这种情况下,我会像枚举一样使用它! 问题答案: 不会覆盖来自的方法,该方法是这样实现的: 因此与(除非为null)相同。

  • 问题内容: 我刚刚开始为AngularJS应用编写测试,并且正在Jasmine中进行测试。 以下是相关的代码段 ClientController: ClientControllerSpec: 测试失败: 有谁知道为什么会发生这种情况吗? 另外..由于我不熟悉AngularJS测试,因此欢迎对我的测试设置错误还是可以改进提出任何意见。 更新: 包括ClientService: 另外,我通过比较id解

  • 在爪哇中。如果我们必须将一个对象与另一个对象进行比较。我们比较该对象中的每个字段。 学生 1 对象具有标记 1、标记 2、标记 3、名称、年龄作为字段。学生 2 对象具有标记 1、标记 2、标记 3、名称、年龄作为字段。因此,要检查2名学生是否相等...我们比较每个字段。 但是,如果 Student 对象有许多字段,该怎么办?学生1对象有标记1,标记2,标记3,名称,年龄,地址,颜色,类,国家,部

  • 问题内容: 我需要编写一个比较器,它采用类型A的对象A和类型B的对象B。这两个对象不是公共对象的扩展。它们的确不同,但是我需要通过其中的通用字段来比较这两个对象。我必须使用比较器接口,因为对象存储在Set中,并且在必须对CollectionUtils执行操作之后。我在Google上搜索了一下,发现了Comparator的解决方案,但只有相同的类型。 我试图朝这个方向实施思考,但是我不知道我是否在正