Java Long類(lèi)型對(duì)比分析
在開(kāi)發(fā)的到一個(gè)很基礎(chǔ)的問(wèn)題
在代碼中,兩個(gè)Long類(lèi)型數(shù)據(jù)比較用“==”,結(jié)果有時(shí)候true有時(shí)候false,原本以為L(zhǎng)ong會(huì)自動(dòng)轉(zhuǎn)long然后再比較,不會(huì)是這里的錯(cuò),找來(lái)找去實(shí)在找不到其他原因了,我就打印這兩個(gè)Long類(lèi)型出來(lái)看,果然是不相等,于是臉黑了一陣......
去查了一下資料,原來(lái)是這樣:Java 基本類(lèi)型的包裝類(lèi)的大部分都實(shí)現(xiàn)了常量池技術(shù),即Byte,Short,Integer,Long,Character;
這5種包裝類(lèi)默認(rèn)創(chuàng)建了數(shù)值[-128,127]的相應(yīng)類(lèi)型的緩存數(shù)據(jù),但是超出此范圍仍然會(huì)去創(chuàng)建新的對(duì)象。
所以
當(dāng)Long型的值超過(guò)了【-128,127】的時(shí)候,他會(huì)new一個(gè)新的對(duì)象,如果沒(méi)有超過(guò)就會(huì)放到緩存中。
所以當(dāng)Long型的值超過(guò)了【-128,127】的時(shí)候,“==”判斷就不會(huì)相等了,可以理解為此時(shí)“==”比較的是兩個(gè)對(duì)象的地址而不是值。
Long class源碼:
public static Long valueOf(long l) { final int offset = 128; if (l >= -128 && l <= 127) { // will cachereturn LongCache.cache[(int)l + offset]; } return new Long(l);}正確的Long類(lèi)型比較姿勢(shì):
1.使用Long的longValue()方法,轉(zhuǎn)換成long值進(jìn)行比較
Long a = 128l;Long b = 128l;a.longValue() == b.longValue(); //true
2.使用Long的equals()方法
Long a = 128l;Long b = 128l;a.equals(b); //true
Long class 源碼:
public boolean equals(Object obj) { if (obj instanceof Long) {return value == ((Long)obj).longValue(); } return false;}java Long型和long型的比較大小一、Long數(shù)據(jù)的大小的比較
對(duì)于Long類(lèi)型的數(shù)據(jù),這個(gè)數(shù)據(jù)是一個(gè)對(duì)象,所以對(duì)象不可以直接通過(guò)“>”,“==”,“<”的比較,如果要比較兩個(gè)對(duì)象的是否相等的話(huà),我們可以用Long對(duì)象的.equals()方法:
對(duì)于long類(lèi)型的數(shù)據(jù),這個(gè)數(shù)據(jù)是一個(gè)基本數(shù)據(jù)類(lèi)型,不屬于對(duì)象,所以可以直接通過(guò)“>”,“==”,“<”作比較
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. python 實(shí)現(xiàn)圍棋游戲(純tkinter gui)2. Python加載數(shù)據(jù)的5種不同方式(收藏)3. python 基于Appium控制多設(shè)備并行執(zhí)行4. python如何實(shí)現(xiàn)word批量轉(zhuǎn)HTML5. python excel和yaml文件的讀取封裝6. 利用單元測(cè)試對(duì)PHP代碼進(jìn)行檢查7. python3實(shí)現(xiàn)往mysql中插入datetime類(lèi)型的數(shù)據(jù)8. Java8內(nèi)存模型PermGen Metaspace實(shí)例解析9. python爬蟲(chóng)實(shí)戰(zhàn)之制作屬于自己的一個(gè)IP代理模塊10. moment轉(zhuǎn)化時(shí)間戳出現(xiàn)Invalid Date的問(wèn)題及解決
