例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...