「Java面試」Integer a1=100 Integer a2=100,a1==a2?的運(yùn)行結(jié)果?

考察目的
這個(gè)問題主要考察Java基礎(chǔ)知識(shí),涉及到的知識(shí)點(diǎn)還挺多的。
比如,==號(hào)表示的內(nèi)存地址匹配、裝箱拆箱、Integer內(nèi)部內(nèi)部的設(shè)計(jì)原理。
大部分同學(xué)能夠熟練使用Integer,但是不一定去了解過原理,但是作為一個(gè)3年以上的開發(fā)。
對(duì)于Java基礎(chǔ)必須要知其然還得知其所以然。

問題分析
按照大家對(duì)于Java基礎(chǔ)的認(rèn)知,兩個(gè)獨(dú)立的對(duì)象用==進(jìn)行比較,是比較兩個(gè)對(duì)象的內(nèi)存地址。
那得到的結(jié)果必然是false。但是在這個(gè)場景中,得到的結(jié)果是true。
為什么呢?
首先, Integer a1=100, 把一個(gè)int數(shù)字賦值給一個(gè)封裝類型,Java會(huì)默認(rèn)進(jìn)行裝箱操作,也就是調(diào)用Integer.valueOf()方法,把數(shù)字100包裝成封裝類型Integer。
其次,在Integer內(nèi)部設(shè)計(jì)中,用到了享元模式的設(shè)計(jì),享元模式的核心思想是通過復(fù)用對(duì)象,減少對(duì)象的創(chuàng)建數(shù)量,從而減少內(nèi)存占用和提升性能。
Integer內(nèi)部維護(hù)了一個(gè)IntegerCache,它緩存了-128到127這個(gè)區(qū)間的數(shù)值對(duì)應(yīng)的Integer類型。
一旦程序調(diào)用valueOf 方法,如果數(shù)字是在-128 到 127 之間就直接在cache緩存數(shù)組中去取Integer對(duì)象。
否則,就會(huì)創(chuàng)建一個(gè)新的對(duì)象。
所以,對(duì)于這個(gè)面試題來說,兩個(gè)Integer對(duì)象,因?yàn)橹刀际?00,并且默認(rèn)通過裝箱機(jī)制調(diào)用了valueOf方法。
從IntegerCache中拿到了兩個(gè)完全相同的Integer實(shí)例。
因此用等號(hào)比較得到的結(jié)果必然是true。

高手:
a1==a2的執(zhí)行結(jié)果是true
原因是Integer內(nèi)部用到了享元模式的設(shè)計(jì),針對(duì)-128到127之間的數(shù)字做了緩存。
使用Integer a1=100這個(gè)方式賦值時(shí),Java默認(rèn)會(huì)通過valueOf對(duì)100這個(gè)數(shù)字進(jìn)行裝箱操作,從而觸發(fā)了緩存機(jī)制,使得a1和a2指向了同一個(gè)Integer地址空間。
總結(jié)
注意,這個(gè)基礎(chǔ)知識(shí)非常重要,如果有些同學(xué)在工作中直接把兩個(gè)Integer封裝類型用等號(hào)去比較,就有可能導(dǎo)致生產(chǎn)故障。
所以大家在寫程序的時(shí)候,一定要對(duì)用到的api和技術(shù)框架的實(shí)現(xiàn)有一定的了解。
不僅僅是為了面試,而是為了提升編碼和架構(gòu)設(shè)計(jì)能力。
今天的文章就到這里了,喜歡我作品的同學(xué)記得三連一下哦!
