摘要:和的區別是的一種基本類型,則是對應的包裝類??吹竭@里大概理解了為什么后兩組的結果是了吧,因為他們本身不是基礎類型,存儲的不是數據值,比較的時候,是去比較引用。
Integer 和 int的區別
int是Java的一種基本類型,Integer則是對應的包裝類。
Integer的默認值是null,int的默認值是0
Integer變量必須實例化后才能使用,而int變量不需要
Integer是引用類型、int則是直接存儲數據值
問題引入int是Java的一種基本類型,Integer則是對應的包裝類,只要接觸過開發,想必都不會陌生,接下來我們來看一組代碼,看看跟你預期的結果是否一致呢。
很簡單的一組大小比較,接下來我們看下程序執行的結果
看到這里,是否有點意外,跟預想中的結果有出入,如果覺得結果可能貼錯了,沒關系,你可以自己嘗試執行一遍。是不是發現執行的結果沒變,num200_0 = num200_1,num1000_0 = num1000_1 這兩組值明明是相等的,為什么打印的結果卻是false?我們回顧一下,Integer是什么?Integer是int的包裝類,其本身不是基本數據類型,是引用數據類型,不會直接存儲數據值。
看到這里,大概理解了為什么后兩組的結果是false了吧,因為他們本身不是基礎類型,存儲的不是數據值,比較的時候,是去比較引用。
但是細心的同學會發現兩個問題
這里的Integer對象是直接賦值的,沒有進行new操作,例如num1000_0和num1000_1都是1000,為什么持有的引用不相等?
既然是引用類型,為什么num0_1、num0_2;num100_0、num100_1這兩組值又是相等的呢?
解決問題看到這里,從代碼表面上和猜想去看的話,已經解決不了問題了,但是我們可以確定,問題一定是出現在Integer這個類上的,那么現在我們帶著這兩個問題來看下Integer源碼。
解決問題之前,我們先來看一下Integer num1000_0 = 1000 做了什么事情
1000是int型基本數據,num1000_0是Integer類型,賦值時Java會進行自動裝箱,也就是Integer num1000_0 = 1000 實際上會解釋成 Integer num1000_0 = Integer.valueOf(1000)。
那么我們看下Integer.valueOf(1000)又做了什么事情。
我們看到Integer類中有一個IntegerCache的內部類,持有一個Integer類型的緩存,默認的緩存范圍是-128到127,如果傳入的i值在緩存范圍內,那么直接從Interger的內部IntegerCache中獲取的,如果傳入的i值大于緩存的范圍,
那么其實是去做了new Integer(i)這個操作。
明白了這一點,那我們回過頭來看下上面的問題自身
問題①
Integer num1000_0 = 1000;
Integer num1000_1 = 1000;
因為1000不在緩存范圍內,所以執行的是new Integer(1000)的操作,所以num1000_0和num1000_1最終是new了兩個對象,因此其引用是不相等的,所以執行結果是false
問題②
Integer num0_1 = 0;
Integer num0_2 = 0;
Integer num100_0 = 100;
Integer num100_1 = 100;
這兩組值都在緩存范圍內,所以num0_1、num0_2;num100_0、num100_1 這兩組值都是去Integer的IntegerCache中的緩存區去拿的,因為拿的是同一個對象,所以執行結果是true。
總結看到這里,想必對與Integer更為了解了吧,日常開發中比如為了校驗int型入參是否為空、ArrayList使用等場景下,int是不能支持的,因此我們會采取Integer去替換int。
但往往在某些地方可能需要做比較的操作,就會出現類似上述問題,相等的值結果執行結果是false,導致代碼流程可能走到錯誤的分支,因此切記使用Integer比較時,要注意值的范圍,必要時使用用intValue()獲取到int值之后再去進行比較。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72356.html
摘要:但其實,虛擬機并不支持這些語法糖。方式為每個泛型類型創建唯一的字節碼表示,并且將該泛型類型的實例都映射到這個唯一的字節碼表示上。GitHub 2.5k Star 的Java工程師成神之路 ,不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的確定不來了解一下嗎); 本文從 ...
摘要:但其實,虛擬機并不支持這些語法糖。方式為每個泛型類型創建唯一的字節碼表示,并且將該泛型類型的實例都映射到這個唯一的字節碼表示上。GitHub 2.5k Star 的Java工程師成神之路 ,不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的確定不來了解一下嗎); 本文從 ...
摘要:但其實,虛擬機并不支持這些語法糖。方式為每個泛型類型創建唯一的字節碼表示,并且將該泛型類型的實例都映射到這個唯一的字節碼表示上。GitHub 2.5k Star 的Java工程師成神之路 ,不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的確定不來了解一下嗎); 本文從 ...
摘要:但是,如果像上例中只取最后幾位的時候,這可不是什么好事,即使我的數據分布很散亂,但是哈希沖突仍然會很嚴重。由于我們所創建的是類型的,這也是最巧的一點,類型的返回值就是其值本身,而存儲的時候元素通過一些運算后會得出自己在數組中所處的位置。 HashSet 是否無序 (一) 問題起因: 《Core Java Volume I—Fundamentals》中對HashSet的描述是這樣的: H...
摘要:動態地代理,可以猜測一下它的含義,在運行時動態地對某些東西代理,代理它做了其他事情。所以動態代理的內容重點就是這個。所以下一篇我們來細致了解下的到底是怎么使用動態代理的。 之前講了《零基礎帶你看Spring源碼——IOC控制反轉》,本來打算下一篇講講Srping的AOP的,但是其中會涉及到Java的動態代理,所以先單獨一篇來了解下Java的動態代理到底是什么,Java是怎么實現它的。 ...
閱讀 825·2019-08-30 15:55
閱讀 1406·2019-08-30 13:55
閱讀 1983·2019-08-29 17:13
閱讀 2840·2019-08-29 15:42
閱讀 1331·2019-08-26 14:04
閱讀 1016·2019-08-26 13:31
閱讀 3271·2019-08-26 11:34
閱讀 828·2019-08-23 18:25