Jyo*_*jan 3 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;
}
}
Run Code Online (Sandbox Code Playgroud)
输出: 不等的对象
但我期待输出会是
两个对象都是平等的
我明白这两个对象有不同的反馈,
System.out.println(cs); //com.sample.personal.checkToString@19821f
System.out.println(c); //com.sample.personal.checkToString@addbf1
Run Code Online (Sandbox Code Playgroud)
但我问,为什么他们有不同的推荐?而在下面的例子中,对象具有相同的存储位置.
Integer a = new Integer(2);
Integer b = new Integer(2);
System.out.println(a); //2
System.out.println(b); //2
Run Code Online (Sandbox Code Playgroud)
我将用户定义类的对象与预定义类的对象进行比较.似乎用户定义类的对象与Integer类的对象的行为相同,其值超过-128到127.为什么这两种情况的引用都不同?(对于Integer类,其值在-128到127之间,对于用户定义的类不同)
equals检查引用的默认实现.您正在创建2个不同的对象,它们不会在内存中引用相同的内容.
一个体面的平等实现将是这样的:
public boolean equals(Object o) {
if (!(o instanceof CheckToString)) {
return false;
}
CheckToString other = (CheckToString) o;
return i == other.i;
}
Run Code Online (Sandbox Code Playgroud)
覆盖时equals,您也需要覆盖hashCode.
无论何时你说new CheckToString(),你在内存中创建一个新对象,所以与另一个完全不同new CheckToString().对象定义中的内容无关紧要.
你提到的关于Integer的东西是真的,但它适用于Integer你创建的自定义对象,而不是它.
| 归档时间: |
|
| 查看次数: |
5299 次 |
| 最近记录: |