java 中如何比较对象?
How objects are compared in java?
所以很长一段时间我认为使用 equals()
比较对象使用 hashcode()
,这意味着如果 2 个对象具有相同的哈希码它 returns true.
源代码中的 equals() 方法:
@see java.lang.System #identityHashCode
public boolean equals(Object obj) {
return (this == obj);
}
所以我创建了这个:
public static void main(String[] args) {
Dog rover = new Dog("Rover");
Dog german = new Dog("Rover2");
System.out.println("German: " + german + "\tRover: " + rover);
System.out.println(german.equals(rover));
}
我也将 hashCode() 重写为:
@Override
public final boolean equals(Object obj) {
if (this == obj)
return true;
}
@Override
public int hashCode() {
//The main point of 0 is to check how equals actually work
return 0;
}
现在打印语句打印错误,即使两个对象都是@Dog0。
想知道为什么
控制台:
German: Animal.Dog@0 Rover: Animal.Dog@0
false
它们不是 "equal" 的原因与哈希码无关。
不相等的原因是这个条件:
this == obj
returns true
仅当 obj
与 this
.
是 相同的 对象
您有 2 个对象,所以这不可能。
还有,从源码可以看出,调用equals()
并没有调用hashCode()
。据我所知,没有实现(无论如何在JDK中),其中equals()
调用hashCode()
。
您将 equals
用作 "alias" 进行 this == obj
比较 这是错误的,这就是它不起作用的原因。
对象具有 equals
方法,因为 this == obj
只有 return 如果它实际上是完全相同的对象(内存中的相同引用)才为真。
您需要做的是手动比较 equals
方法中的属性,只有 return 匹配才为真。
所以很长一段时间我认为使用 equals()
比较对象使用 hashcode()
,这意味着如果 2 个对象具有相同的哈希码它 returns true.
源代码中的 equals() 方法:
@see java.lang.System #identityHashCode
public boolean equals(Object obj) {
return (this == obj);
}
所以我创建了这个:
public static void main(String[] args) {
Dog rover = new Dog("Rover");
Dog german = new Dog("Rover2");
System.out.println("German: " + german + "\tRover: " + rover);
System.out.println(german.equals(rover));
}
我也将 hashCode() 重写为:
@Override
public final boolean equals(Object obj) {
if (this == obj)
return true;
}
@Override
public int hashCode() {
//The main point of 0 is to check how equals actually work
return 0;
}
现在打印语句打印错误,即使两个对象都是@Dog0。 想知道为什么 控制台:
German: Animal.Dog@0 Rover: Animal.Dog@0
false
它们不是 "equal" 的原因与哈希码无关。
不相等的原因是这个条件:
this == obj
returns true
仅当 obj
与 this
.
是 相同的 对象
您有 2 个对象,所以这不可能。
还有,从源码可以看出,调用equals()
并没有调用hashCode()
。据我所知,没有实现(无论如何在JDK中),其中equals()
调用hashCode()
。
您将 equals
用作 "alias" 进行 this == obj
比较 这是错误的,这就是它不起作用的原因。
对象具有 equals
方法,因为 this == obj
只有 return 如果它实际上是完全相同的对象(内存中的相同引用)才为真。
您需要做的是手动比较 equals
方法中的属性,只有 return 匹配才为真。