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 显示。