包裝型別之間一律使用equals來判斷值是否相等
阿新 • • 發佈:2021-02-04
大家都知道 java 中 == 和 equal 的區別。
== 操作:如果比較的是兩個基本資料型別,則比較值是否相等,對於引用型變數是判斷變數是否指向同一引用物件,比地址。
equals 操作表示的兩個變數是否是對同一個物件的引用,比地址。
包裝型別是引用型別,所以使用==是不能比較包裝型別物件包含的值是否相等,==只是比較兩個引用變數是否指向相同的物件。
由於在jdk1.5之後,支援自動裝箱功能,對於Integer會出現下面這種情況:
public static void main(String[] args) {
Integer a1 = 127;
Integer a2 = 127;
// true
System.out.println(a1 == a2);
}
上述程式碼中,a1 == a2 結果為true,這只是一個假象,讓人誤以為可以使用==來比較Integer物件的值是否相等,其實a1和a2引用的是同一個Integer物件,所以a1 ==a2 才會返回true。
那為什麼a1與a2會引用同一個Integer物件呢?
當使用自動裝箱方式建立一個Integer物件時,當數值在-128 ~127時,會將建立的Integer物件快取起來,當下次再出現該數值時,直接從快取中取出對應的Integer物件。所以上述程式碼中,a1和a2引用的是相同的Integer物件。
public static void main(String[] args) {
Integer b1 = 128;
Integer b2 = 128;
// false
System.out.println(b1 == b2);
}
看下這個例子:
package stack;
import java.util.Deque;
import java.util.LinkedList;
public class test{
public static void main(String[] args){
Deque< Integer> stack1 = new LinkedList<>();
Deque<Integer> stack2=new LinkedList<>();
stack1.push(128);
stack2.push(128);
stack1.push(128);
stack2.push(128);
stack1.push(1);
stack2.push(1);
if(stack1.pop()==stack2.pop()){
System.out.println("數值在-128 ~127內時,引用同一個Integer物件------相等");
}
if(stack1.pop()!=stack2.pop()){
System.out.println("數值不在-128 ~127內時,引用不同的Integer物件------不相等");
}
if(stack1.pop().equals(stack2.peek())){
System.out.println("要比較引用型別變數的成員變數值是否相等,要使用equals方法。");
}
}
}
輸出結果:
數值在-128 ~127內時,引用同一個Integer物件------相等
數值不在-128 ~127內時,引用不同的Integer物件------不相等
要比較引用型別變數的成員變數值是否相等,要使用equals方法。
遺留問題:
但,Object equals() 方法也是和==一樣比較物件是不是相同的引用,為什麼在比較包裝型別,看value就可以呢?
因為,同String一樣,裡面重寫了該方法:
總結:
1.所有包裝型別一律使用equals方法比較值是否相等;
2.所有引用型別,當使用==運算子時,比較的是兩個引用型別變數是否指向相同的物件;
3.要比較引用型別變數的成員變數值是否相等,要使用equals方法。