public class Eas {
private int age;
private int a;
public Eas(int age, int a) {
this.age = age;
this.a = a;
}
public Eas() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Eas eas = (Eas) o;
return age == eas.age &&
a == eas.a;
}
@Override
public int hashCode() {
return Objects.hash(age, a);
}
}自定義的一個Eas類,當運行的時候
package teste;
public class m {
public static void main(String[] args) {
Eas eas = new Eas(12,1);
Eas eas1 = new Eas(12,1);
System.out.println(eas);
System.out.println(eas1);
System.out.println(eas==eas1);
;
}
}
輸出結果前兩個是一樣的,第三個輸出是false,請問有人知道為什么前兩個輸出值是一樣的?在類中并沒有重寫toString方法?那么輸出的地址應該是不一樣的,第三個==輸出false也表明地址不一樣是兩個物件,請問這里是怎么回事?有大神知道嗎?
uj5u.com熱心網友回復:
== 比較的是兩個變數是不是指向同一個存在記憶體里的物件實體,也就是他們兩個的記憶體地址是否一樣。如果要比較兩個是否邏輯上相同,應該用 equalsuj5u.com熱心網友回復:
輸出的并不是地址,輸出的值與hashcode有關系,詳情自己看原始碼,因為你重寫了hashcode方法,所有兩個物件的hashcode一樣,你取消重寫了就可以看到不同的結果了uj5u.com熱心網友回復:
因為==是記憶體地址值的對比!System.out.println(System.identityHashCode(eas));
System.out.println(System.identityHashCode(eas1));
你列印一下就知道結果了!
uj5u.com熱心網友回復:
各位大佬說的我都看了,我明白==是對物件地址的比較。首先肯定這兩個物件肯定是兩個物件,地址值肯定不同!
System.out.println(eas);
System.out.println(eas1)
但是這兩句輸出的結果不應該是地址值嗎?難道重寫hashCode方法會使輸出的值變化成其他的值?那這個值是什么呢又?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/130953.html
標籤:Java SE
上一篇:幫忙看一下有什么問題,怎么改?
下一篇:Java離線訊息
