java equals方法詳解

序言:準備總結一些java基礎的知識方便以後查閱,從equals入手

目錄:

  1. 等於(==)詳解
  2. equals方法詳解

一、等於(==)詳解

先明確一點:“==” 其實是存儲地址的比較

1.在八大基本類型中‘==’
在基本類型,用“==”來比較兩個變量存儲的地址(變量存儲的地址是其所指常量池中常量的地址),因常量地址和常量值一一對應,比較常量地址就是比較常量值,如下圖:

在這裏插入圖片描述

結論:基本數據類型使用"=="可以判斷兩個變量(無論存儲地址還是值)是否相等

2.引用類型對象中‘==’
在引用類型對象,用“==”來比較兩個引用變量地址(引用變量存儲的地址是其所指堆中對象的地址),每個對象地址不同,如下圖:
在這裏插入圖片描述

結論:每一個對象都有自己的一塊內存進行存儲,所以每個對象地址都不一樣。所以自定義類型使用"=="只能判斷兩個引用變量(地址)相等~是否爲同一對象,無法判斷兩個對象(屬性值)是否相等

3.特例:基本包裝類型中‘==’
在基本包裝類型(Integer、Short、Byte、Character、Long)有緩存-128<=int<=127,分情況:
1、Integer it = 127;這種直接賦值常量方式比較相等,因常量值-128<=int<=127在java棧中有緩存都指向同一個地址,所以==可以判斷兩個變量相等。如果it>127或者it<-128就無法比較變量相等

2、Integer it = new Integer(8);這種創建對象方式比較相等,因每個對象有一塊內存地址存儲,所以==無法判斷兩個對象屬性值相等

二、equals方法詳解

先明確兩點:1、java對象的equals()方法都是繼承Object.equals(Object o)方法的,該父類的equals方法其實就是使用了“==”。 2、equals其實無法在基本類型(int、char等)中比較使用,只能在基本包裝類中使用(Integer、Character等)

1.在八大基本包裝類型中equals()
在基本包裝類型中,使用的equals()都重寫了父類的equals()方法,先比較類型再比較值

//以Interger的equals方法爲例
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

結論:基本包裝類型可以使用equals()可以判斷兩個引用變量(屬性值)是否相等

2、引用類型對象中equals()
一般引用類型如String都會重寫equals()方法,來讓equals()方法可以比較兩個對象值是否相等。

public boolean equals(Object anObject) {
   //使用“==”判斷是否爲同一個對象
    if (this == anObject) {
        return true;
    }
    //判斷參數是否爲String類型
    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;
  }

結論:引用類型重寫equals()方法可以判斷兩個對象(屬性值)是否相等,一般我們自定義的引用的類都會重寫equals()和hashcode()方法。當然有例外:StringBuffer和StringBuilder就沒有重寫,無法判斷其對象值是否相等。

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