国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

作為Java code copyer,你真的了解Integer嗎

LMou / 2786人閱讀

摘要:和的區別是的一種基本類型,則是對應的包裝類??吹竭@里大概理解了為什么后兩組的結果是了吧,因為他們本身不是基礎類型,存儲的不是數據值,比較的時候,是去比較引用。

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

相關文章

  • Hollis原創|不了解這12個語法糖,別說Java

    摘要:但其實,虛擬機并不支持這些語法糖。方式為每個泛型類型創建唯一的字節碼表示,并且將該泛型類型的實例都映射到這個唯一的字節碼表示上。GitHub 2.5k Star 的Java工程師成神之路 ,不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的確定不來了解一下嗎); 本文從 ...

    番茄西紅柿 評論0 收藏0
  • Hollis原創|不了解這12個語法糖,別說Java

    摘要:但其實,虛擬機并不支持這些語法糖。方式為每個泛型類型創建唯一的字節碼表示,并且將該泛型類型的實例都映射到這個唯一的字節碼表示上。GitHub 2.5k Star 的Java工程師成神之路 ,不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的確定不來了解一下嗎); 本文從 ...

    番茄西紅柿 評論0 收藏0
  • Hollis原創|不了解這12個語法糖,別說Java

    摘要:但其實,虛擬機并不支持這些語法糖。方式為每個泛型類型創建唯一的字節碼表示,并且將該泛型類型的實例都映射到這個唯一的字節碼表示上。GitHub 2.5k Star 的Java工程師成神之路 ,不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的確定不來了解一下嗎); 本文從 ...

    yy13818512006 評論0 收藏0
  • 深入分析——HashSet是否真的無序?(JDK8)

    摘要:但是,如果像上例中只取最后幾位的時候,這可不是什么好事,即使我的數據分布很散亂,但是哈希沖突仍然會很嚴重。由于我們所創建的是類型的,這也是最巧的一點,類型的返回值就是其值本身,而存儲的時候元素通過一些運算后會得出自己在數組中所處的位置。 HashSet 是否無序 (一) 問題起因: 《Core Java Volume I—Fundamentals》中對HashSet的描述是這樣的: H...

    everfight 評論0 收藏0
  • 真的完全了解Java動態代理?看這篇就夠了

    摘要:動態地代理,可以猜測一下它的含義,在運行時動態地對某些東西代理,代理它做了其他事情。所以動態代理的內容重點就是這個。所以下一篇我們來細致了解下的到底是怎么使用動態代理的。 之前講了《零基礎帶你看Spring源碼——IOC控制反轉》,本來打算下一篇講講Srping的AOP的,但是其中會涉及到Java的動態代理,所以先單獨一篇來了解下Java的動態代理到底是什么,Java是怎么實現它的。 ...

    haitiancoder 評論0 收藏0

發表評論

0條評論

LMou

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<