-
== 與 equals()
對象中 == 與 equals() 比較的都是內存地址,重寫equals()可實現比較對象中的值。
源碼如下:public boolean equals(Object obj) { return (this == obj); }
String對象中,equals()是值的比較,因爲String重寫了equals()。
源碼如下:public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
問:== 比較的是內存地址,爲什麼String中的 == 比較的是值?
答:String中的 == 比較的也是內存地址,String創建對象有兩種方式,分別爲通過new創建和直接賦值。new出來的情況下, == 比較的就是內存地址,毋庸置疑,到了這裏就能證明String中 == 比較的不是值;那麼直接賦值的情況呢,常量是程序初始化的時候就存在於方法區中,常量不重複存在,舉個例子:public static void main(String[] args) { String a = "string"; String b = "string"; System.out.println(a == b); }
程序初始化的時候,第一個“string”被創建,執行到第二個“string”的時候,由於方法區中已經存在,所以不重複創建,也就是說a、b指向的是同一個“string”,內存地址相等,結果返回true
-
equals() 與 hashCode()
問:重寫equals()必須重寫hashCode()嗎?
答:不是,需要用到hashCode()的時候才需要重寫,如hashMap等,有一位博主寫的通俗易懂,上鍊接:
幫你搞懂Java中重寫equals方法爲什麼要重寫hashcode方法?
一般,重寫了equals()都要重寫一下hashCode(),避免概念混淆。 -
hashCode()與內存地址
問:重寫hashCode()之後多個只是值相同的對象共用同一個內存地址了?
答:不是的,hashCode()默認返回內存地址,但重寫之後,返回的不再是內存地址,只是一個hash值;System.identityHashCode(Object)纔是獲取真正的內存地址方法,所以重寫hashCode()並不會修改內存地址。
Java中的 ==、equals()、hashCode()與內存地址
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.