1. 程式人生 > 其它 >包裝型別之間一律使用equals來判斷值是否相等

包裝型別之間一律使用equals來判斷值是否相等

技術標籤:javajava

大家都知道 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物件。

如果數值不在在-128 ~127時,

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方法。