Java 包裝模擬較時帶來的問題

2021-09-14 07:46:23 字數 1426 閱讀 9370

例1:

integer a = 1;

integer b = 2;

integer c = 3;

integer d = 3;

integer e= 321;

integer f= 321;

long g = 3l;

system.out.println(c == d); //1

system.out.println(e == f); //2

system.out.println(c == (a+b)); //3

system.out.println(c.equals(a+b));//4

system.out.println(g == (a+b)); //5

system.out.println(g.equals(a+b)); //6

輸出結果

true

false

true

true

true

false

1.包裝模擬較,不會自動拆包,但是integer中會有乙個cache 儲存-128到127的數,所以c與d的位址值相同。

2.位址值比較,沒用到cache

3.當 '=='時,右側發生自動拆包,所以其實是int值在比較

4.a+b 時拆包成int,傳入integer的equals方法進行自動裝包。equals方法內是值比較。

5.會拆包成基礎資料型別比較

6.包裝類的equals 會判斷型別,long.equals(object object)中判斷型別不符合,返回false。

例2:

long a = 1l;

integer b = 1;

system.out.println(a.equals(1)); //7

system.out.println(a.equals(1l));

system.out.println(a.equals(b));

輸出

false

true

false

看包裝類原始碼會發現比較時會先去判斷型別是否相同。

7.a.equals(1)時,int 1 裝包成integer,自然和long不同型別。

public boolean equals(object obj) 

return false;

}

總結:

當使用自動拆包/裝包時,包裝類之間比較並不會自動拆包,是位址比較,其中還有快取會影響結果。

用包裝類的equals方式比較時,由於包裝類並不會自動去轉換型別,所以型別不同時,即使值相同,也會返回false。所以在用包裝模擬較數值時,不要用'==',用equals方法時要注意型別相同,或者直接用基礎資料型別比較。

Java包裝模擬較和包裝類底層快取陣列

關於包裝類的比較問題,我們先看以下 integer i1 100 integer i2 100 integer i3 200 integer i4 200 system.out.println i1 i2 true system.out.println i3 i4 false double d1 1...

java模擬登入的一些問題

最近在做採集程式,用到模擬登入,用正常的httppost等都會顯示登入失敗,結果靜下心研究了一番,發現沒有登入就會有乙個request cookie,於是把這個第一次先get請求登入頁面獲取request cookie,然後再將該request cookie放到request header裡面的co...

Java多執行緒模擬賣票的問題及解釋

建立執行緒常用的兩種方式,一是實現runnable介面,二是繼承thread類,都需要重寫run 方法。第一種繼承thread類 public class testthread extends thread override public void run else catch interrupte...