HashCode和equals对对象实例化的影响
Influence of HashCode and equals on object's instanciation
我对方法做了一些测试。我遇到了一个让我完全困惑的案例。这是一个例子。
public abstract class Ge {
private boolean valid;
public Ge(boolean valid) {
this.valid = valid;
}
@Override
public int hashCode() {
return this.getClass().getSimpleName().hashCode();
}
@Override
public boolean equals(Object obj) {
if (getClass() == obj.getClass())
return true;
return false;
}
}
public class Ge1 extends Ge{
public Ge1(boolean valid) {
super(valid);
}
}
public class Ge1 extends Ge{
public Ge1(boolean valid) {
super(valid);
}
}
public class Ge2 extends Ge{
public Ge2(boolean valid) {
super(valid);
}
}
测试class:
public static void main(String args[]){
Ge1 ge1=new Ge1(true);
System.out.println(Integer.toHexString(System.identityHashCode(ge1)));
Ge1 ge11=new Ge1(false);
System.out.println(Integer.toHexString(System.identityHashCode(ge11)));
}
虽然在eclipse控制台中System.identityHashCode的值不同,但是debug模式下的ge1和ge11变量引用相同
但是,如果我删除 class Ge 中的 hashcode 和 equals,则 ge1 和 ge11 具有不同的引用。
我不明白为什么 ge1 和 ge11 具有与 hashcode 和 equals 相同的引用?
对象的 toString()
方法记录为
this method returns a string equal to the value of:
getClass().getName() + '@' + Integer.toHexString(hashCode())
您的算法为 Ge1 的所有实例提供了相同的 hashCode。
所以 Ge1 的所有实例也有相同的值由 toString()
返回并由 Eclipse 显示。
我对方法做了一些测试。我遇到了一个让我完全困惑的案例。这是一个例子。
public abstract class Ge {
private boolean valid;
public Ge(boolean valid) {
this.valid = valid;
}
@Override
public int hashCode() {
return this.getClass().getSimpleName().hashCode();
}
@Override
public boolean equals(Object obj) {
if (getClass() == obj.getClass())
return true;
return false;
}
}
public class Ge1 extends Ge{
public Ge1(boolean valid) {
super(valid);
}
}
public class Ge1 extends Ge{
public Ge1(boolean valid) {
super(valid);
}
}
public class Ge2 extends Ge{
public Ge2(boolean valid) {
super(valid);
}
}
测试class:
public static void main(String args[]){
Ge1 ge1=new Ge1(true);
System.out.println(Integer.toHexString(System.identityHashCode(ge1)));
Ge1 ge11=new Ge1(false);
System.out.println(Integer.toHexString(System.identityHashCode(ge11)));
}
虽然在eclipse控制台中System.identityHashCode的值不同,但是debug模式下的ge1和ge11变量引用相同
但是,如果我删除 class Ge 中的 hashcode 和 equals,则 ge1 和 ge11 具有不同的引用。
我不明白为什么 ge1 和 ge11 具有与 hashcode 和 equals 相同的引用?
对象的 toString()
方法记录为
this method returns a string equal to the value of:
getClass().getName() + '@' + Integer.toHexString(hashCode())
您的算法为 Ge1 的所有实例提供了相同的 hashCode。
所以 Ge1 的所有实例也有相同的值由 toString()
返回并由 Eclipse 显示。