Java中的 ==、equals()、hashCode()與內存地址

  • == 與 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()並不會修改內存地址。

發佈了4 篇原創文章 · 獲贊 3 · 訪問量 5753
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章