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