1. 程式人生 > >Integer比較時最好不要用==

Integer比較時最好不要用==

上述程式碼的答案,涉及到Java緩衝區和堆的問題。

java中Integer型別對於-128-127之間的數是緩衝區取的,所以用等號比較是一致的。但對於不在這區間的數字是在堆中new出來的。所以地址空間不一樣,也就不相等。

Integer b3=60,這是一個裝箱過程也就是Integer b3=Integer.valueOf(60)

所以,以後碰到Integer比較值是否相等需要用intValue()

對於Double沒有緩衝區。

答案

1:=true
2:=true
3:=false
4:=false

參考文章地址:http://blog.csdn.net/danielinbiti/article/details/39996065

原始碼中Integer範圍的原因,可以參考:http://www.blogjava.net/zhangyuan/archive/2010/07/24/327011.html

(總結:這就歸結於java對於Integer與int的自動裝箱與拆箱的設計,是一種模式:叫享元模式(flyweight) 
為了加大對簡單數字的重利用,java定義:在自動裝箱時對於值從–128到127之間的值,它們被裝箱為Integer物件後,會存在記憶體中被重用,始終只存在一個物件 

而如果超過了從–128到127之間的值,被裝箱後的Integer物件並不會被重用,即相當於每次裝箱時都新建一個 Integer物件(還是需要用equals來比較,已經重寫);

以上的現象是由於使用了自動裝箱所引起的,如果你沒有使用自動裝箱,而是跟一般類一樣,用new來進行例項化,就會每次new就都一個新的物件;

參考部落格地址:http://blog.csdn.net/shaowei213/article/details/39359239)

(除了上述的原因敘述之外,還有的詳細文字版的解釋的參考部落格文章為:http://1006836709.iteye.com/blog/1714378)

相關推薦

Integer比較最好不要==

上述程式碼的答案,涉及到Java緩衝區和堆的問題。 java中Integer型別對於-128-127之間的數是緩衝區取的,所以用等號比較是一致的。但對於不在這區間的數字是在堆中new出來的。所以地址空間不一樣,也就不相等。 Integer b3=60,這是一個裝箱過程也就是Integer b3=In

切換controller 後面的最好不要id參數,不然會根據路由規則改變

edit 改變 val body ret ont bsp IT 規則 //切換actionResult return RedirectToAction("Edit", "EngineeringCase", new { id = retValue.Va

MongoDB中的一些坑(最好不要

ODB 關系 有一種 徹底 是把 shard 內存數據庫 完整 發的 MongoDB 是目前炙手可熱的 NoSQL 文檔型數據庫,它提供的一些特性很棒:如自動 failover 機制,自動 sharding,無模式 schemaless,大部分情況下性能也很棒。但是薄荷在深

JavaScript中遍歷數組,最好不要for...in

標準 .com key javascrip 是我 ring 表示 技術分享 就是 先看一段代碼 var arr = [2,3,4,5]; for(var i = 0; i < arr.length; i++){ console.log(i

UDP傳輸IP層的分片是怎麼回事? UDP傳輸為什麼不要tcpdump過濾埠來抓包?

先來看程式, 服務端: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netin

(轉)MongoDB中的一些坑(最好不要

MongoDB 是目前炙手可熱的 NoSQL 文件型資料庫,它提供的一些特性很棒:如自動 failover 機制,自動 sharding,無模式 schemaless,大部分情況下效能也很棒。但是薄荷在深入使用 MongoDB 過程中,遇到了不少問題,下面總結幾個我們

shell腳本里面相互呼叫路徑不要pwd獲取

shellA呼叫shellB,如果shellB 裡面需要使用路徑作為變數,去尋找其它檔案。那麼要注意,不用pwd,其返回的是系統中使用者當前所在位置的路徑,也就是shellA的路徑,這樣就錯了。應該用dirname $0,找出當前執行檔案的路勁。 場景: 指令碼 obse

input checkbox操作,最好prop,不要attr

sel 好用 else == all select box ctc () $(".selectAll").on(‘click‘,function(){ if($(this).attr(‘data‘) == 1){ $(".selectCheckBox")

Java Integer於Int 進行==雙等於的記憶體比較的一些問題說明

轉自: https://blog.csdn.net/xingkongdeasi/article/details/79618421 部分有所修改:   前言:     越是簡單的東西,我們往往越是沒有去把它明白,但我們大部分時間又常常在用,就像我們今天說的int與Inte

通過Python爬取了B站兩千萬戶資料!險些出事!最好不要商用!

1 前言 前兩天閒來無事,花了四五天的時間從B站(bilibili.com)抓取了其 2000萬 全部使用者。   2 使用者情況 B站是一個ACG動漫文化很濃厚的場所,與A站(AcFun)共同撐起了中國動漫的一片天。 所以使用者嘛…… 不說了,簡單看看我隨便

Effective C++:儘量pass-by-reference替換pass-by-value;必須返回物件不要妄想返回其引用

Q: 在編寫類的成員函式時,比如過載一些運算子,時常會發現形參和返回型別在可以直接傳值/返回物件的情況下卻選擇了引用的形式,而有時候則不如此,因而有些困惑。 A:首先,大前提下,要儘可能用引用的形式代替函式中的傳值/返回物件。因為在傳值和返回物件的過程中,實際上進入函式的

記得比較的時候要double型別比較不要Double,Double是引用型別==比較不對

  記得比較的時候要用double型別比較,不要用Double,Double是引用型別用==比較不對 : //查詢未更新的返利額度 Map<返利大區-額度> preRebateMap List<RebateMont

使用SQL Server Management Studio操作replication,要機器名登入,不要IP地址

如果你在使用SSMS(SQL Server Management Studio)登入SQL Server時,使用的是IP地址,如下圖所示: 當你操作replication時,會報錯:   從上面的錯誤提示可以看出,我們只能通過機器名(server name)來登入SSMS,才能夠操

微控制器在清除標誌位不要位操作

       這兩天在除錯一個專案的時候,一臺主機與兩臺從機通訊,但是有一臺從機的報文收不到,仔細閱讀程式碼,發現暫存器等配置都正常,自信閱讀程式碼發現在清接收完成暫存器的時候用到了位域,猜想這就是問題所在,於是修改了程式,下載後一切正常。在微控制器中一般的標誌暫存器都是寫

關於Integer數值大於127使用等號比較的坑

Integer的值在-128到127時,Integer物件是在IntegerCache.cache產生,會複用已有物件,也就是說,這個區間的Integer可以直接用等號進行判斷。Integer的值在-

Integer包裝類與基本型別比較值大小,equal不用‘==’

Integer為物件判斷是否相等還是使用equals最靠譜,或者用Integer的這個intValue()方法轉換成int型別int為基本型別,判斷是否相等就是可以使用==.其中的原因(原始碼):static final Integer cache[] = new Integ

編寫安全程式碼——不要memcmp比較structure

本文的copyleft歸[email protected]所有,使用GPL釋出,可以自由拷貝,轉載。但轉載請保持文件的完整性,註明原作者及原連結,嚴禁用於任何商業用途。作者:[email protected]部落格:linuxfocus.blog.chi

改進Vim體驗:在插入模式下移動光標,我不要方向鍵!alt快捷鍵使用技巧!

targe 判斷 映射 tar 什麽 nbsp .vimrc 一次 time 改進Vim體驗:在插入模式下移動光標,我不要用方向鍵!alt快捷鍵使用技巧! 大家都知道,我們在插入模式下編輯代碼的時候 若想寫完這一部分後,移動到鄰近的一部分,如下一個單詞的後面,是很復雜的

投資人的能量往往大多遠遠不僅於此,他能站在不同的角度和高度看問題(要早點拿投資,要舍得讓出股份)——最好不要讓 Leader 一邊做技術、一邊做管理,人的能力是有限的,精力也是有限的

探索 行業 編程 資金 背景 八仙過海 源代碼 運營 拒絕    摘要:在創業三年時間裏作為聯合創始人,雖然拿著大家均等的股份,我始終是沒有什麽話語權的,但是,這也給了我從旁觀者的角度看清整個局面的機會。創業公司的成敗絕大程度取決於技術大牛和公司 Leader,這兩個人最

判斷Integer值相等最好不用==最好使用equals

問題 print 內存地址 ++ i++ 是否 出錯 地址 equal Integer c = 3;Integer d = 3;Integer e = 321;Integer f = 321;System.out.println(c == d);System.out.pri