首先,你的方法是错误的。您正在计算没有从Object
覆盖toString()
方法的类的字符串表示形式。
的Object.toString
方法,如果不被重写时,返回一个由类,@
的名称的字符串,并且对象的哈希码。这不是它的地址,它与地址无关。因此,具有相同散列码的两个对象将返回相同的字符串。
为了证明,让我们来看看它覆盖equals
和hashCode
但不会覆盖toString
方法的小类:
class MyInteger {
int myInteger;
public MyInteger(int myInteger) {
this.myInteger = myInteger;
}
public int getInteger() {
return myInteger;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof MyInteger) {
return myInteger == ((MyInteger)obj).myInteger;
}
return false;
}
@Override
public int hashCode() {
return myInteger;
}
}
现在,让我们来试试你的区分两个不同的对象的方法:
MyInteger int1 = new MyInteger(1004);
MyInteger int2 = new MyInteger(1004);
System.out.println(int1+" "+int2);
印刷会是这样的结果:
[email protected] [email protected]
但很明显,int1
和int2
指向两个不同的对象,用new
明确创建!
因此,忘记这种方法 - 它没有意义。
现在,你怎么知道两个对象是不同的?很简单,请将参考文献与==
或!=
进行比较。
所以,如果我尝试了上述
System.out.println(int1 != int2);
其结果将是true
。
这是相同的字符串:
String a="helloworld";
String b="hello";
String c=b+"world";
String d="hello";
System.out.println("a refers to a different object than c? " + (a != c));
System.out.println("b refers to a different object than d? " + (b != d));
印刷的结果将是:
a refers to a different object than c? true
b refers to a different object than d? false
我很困惑,其答案选择,因为他们都是很好的,但我喜欢你的回答除了其他的是你hashCose javaspecs.Thanks – silentprogrammer