序言:準備總結一些java基礎的知識方便以後查閱,從equals入手
目錄:
- 等於(==)詳解
- 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就沒有重寫,無法判斷其對象值是否相等。