gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:58:33 25 4
gpt4 key购买 nike

请看下面的代码

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com