java - .equals() 用于 Java 中的用户定义类

标签 java equals user-defined

请看下面的代码

class TestToString 
{
  public static void main(String args[]) 
  {
    CheckToString cs = new CheckToString (2);
    CheckToString c = new CheckToString (2);
    if( cs.equals(c))
       System.out.println(" Both objects are equal");
    else
       System.out.println(" Unequal objects ");
  }
}

class CheckToString 
{
   int i;
   CheckToString () 
   {
      i=10;
   }
   CheckToString (int a) 
   {
     this.i=a;
   }
}

输出: 不等对象

但我期待输出将是

两个对象是相等的

我知道这两个对象有不同的引用,

System.out.println(cs); //com.sample.personal.checkToString@19821f
System.out.println(c); //com.sample.personal.checkToString@addbf1

但我在问,为什么他们有不同的引用? 而在下面的例子中,对象具有相同的内存位置。

Integer a = new Integer(2);
Integer b = new Integer(2);
System.out.println(a);           //2
System.out.println(b);           //2

我正在比较用户定义类的对象和预定义类的对象。 似乎用户定义类的对象与 Integer 类的对象行为相同,其值超出 -128 到 127。为什么这两种情况的引用不同? (对于值在 -128 到 127 之间的 Integer 类相同,对于用户定义的类不同)

最佳答案

equals 的默认实现检查引用。您正在创建 2 个不同的对象,它们在内存中引用的不是同一事物。

一个像样的 equals 实现应该是这样的:

public boolean equals(Object o) {
  if (!(o instanceof CheckToString)) {
    return false;
  }
  CheckToString other = (CheckToString) o;
  return i == other.i;
}

当重写equals时,你也需要重写hashCode

无论何时您使用 new CheckToString(),您都在内存中创建一个新对象,因此这是一个与另一个 new CheckToString() 完全不同的引用。对象定义中的内容并不重要。

您提到的有关 Integer 的内容是真实的,但它适用于 Integer,不适用于您创建的自定义对象。

关于java - .equals() 用于 Java 中的用户定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12972362/

相关文章:

如果hashCode相同并且equals为真,Java HashMap如何识别关键对象?

variables - 如何在用户定义的字符类中插入变量?

database-design - 在数据库中模拟用户定义的层次关系的最佳方法是什么?

Java从unix时间戳获取当前日期

java - 需要帮助来创建数据库 (Java)

java - JLabel 和 JTextField 字符串比较

java - Java检查内存地址中==运算符的作用

c# - .NET 框架库是否被视为用户定义的?

java - 为android编写一个超时事件

java - jMockit - 如何使构造函数调用返回模拟