== 、equals() 、hashCode() 用法總結

==

用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是棧內存中存放的對象的堆內存地址。

操作符兩端的操作數必須是同一類型的(可以是父子類之間)才能編譯通過。

  • 比較基本數據類型:如果兩個值相同,則結果爲true
  • 比較引用:如果引用指向內存中的同一對象,結果爲true

代碼所示,他們都指向地址爲10的堆。

public class Test {
    public static void main(String[] args) {		
		int a = 10;
        long b = 10L;
        double c = 10.0;
        System.out.println(a == b); // true
        System.out.println(a == c); // true
        System.out.println(b == c); // true
    }
}

equals

  • equals用來比較的是兩個對象的內容是否相等:如果兩個對象的類型一致,並且內容一致,則返回true,

  • 由於所有的類都是繼承自java.lang.Object類的,所以適用於所有對象

  • 若未對該方法進行覆蓋重寫,調用的仍然是Object類中的方法,返回的是==的判斷

equals方法是在所有類的基類Object中進行定義的,源碼:

public boolean equals(Object obj) {
    return (this == obj);
}

特殊

String s = "aaa";

  • 它是java中唯一不需要new 就可以產生對象的途徑.
  • 形式賦值在java中叫直接量,是在常量池中而不是象new一樣放在堆中。
  • 這種形式的字符串,在JVM內部發生字符串拘留
  • 即當聲明這樣的一個字符串後,JVM會在常量池中先查找有有沒有一個值爲"aaa"的對象,如果有,就會把它賦給當前引用。
  • 即原來那個引用和現在這個引用指點向了同一對象,如果沒有,則在常量池中新創建一個"aaa".
  • 只要值相等,任何多個引用都指向同一對象

String類重寫了equals方法

源碼:

public boolean equals(Object anObject) {
 2     if (this == anObject) {
 3         return true;
 4     }
 5     if (anObject instanceof String) {
 6         String anotherString = (String)anObject;
 7         int n = count;
 8         if (n == anotherString.count) {
 9         char v1[] = value;
10         char v2[] = anotherString.value;
11         int i = offset;
12         int j = anotherString.offset;
13         while (n-- != 0) {
14             if (v1[i++] != v2[j++])
15             return false;
16         }
17         return true;
18         }
19     }
20     return false;
21     }

hashCode

hash是一個函數,該函數中的實現就是一種算法,就是通過一系列的算法來得到一個hash值

通過hash算法得到的hash值就在hash表中,也就是說,hash表就是所有的hash值組成的

有很多種hash函數,也就代表着有很多種算法得到hash值。

hashcode就是在hash表中有對應的位置。

hashcode代表對象的地址說的是對象在hash表中的位置,物理地址說的對象存放在內存中的地址

默認情況下,Object中的hashCode() 返回對象的jvm地址。

  • 如果兩個對象equals相等,那麼這兩個對象的HashCode一定也相同
  • 如果兩個對象的HashCode相同,不代表兩個對象就相同,只能說明這兩個對象在散列存儲結構中,存放於同一個位置。

String類中重寫 了hashCode方法

源碼:(點擊跳轉源碼解析

public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章