? 在這里,我首先講一下常量池的概念和在jvm里面內(nèi)存存儲情況。
1:常量池(constant pool),就是存放常量的池子(為什么會有常量池這種東西存在我在這里不做闡述,可以看看java虛擬機(jī)內(nèi)存分析)。
2:int / Integer 在內(nèi)存中的位置:首先我們舉個(gè)列子:

上面的三種創(chuàng)建整型方法大家應(yīng)該再熟悉不過了,但是他們在內(nèi)存中的存儲位置卻有著很大區(qū)別。
int a =1 和Integer a1 =1 其實(shí)是一種形式,只不過Integer a1 =1 最終是做了拆箱,和 int a =1 是一個(gè)東西 ,這里沒有用new關(guān)鍵字而是直接賦值,內(nèi)存分析如下,首先會查找常量池中有沒有該數(shù)據(jù),如果有則直接返回引用,如果沒有則在常量池中創(chuàng)建該數(shù)據(jù)再返回引用。
Integer c1 =new Integer(1),內(nèi)存分析如下:首先查找常量池有沒有該數(shù)據(jù),如果沒有則首先在棧內(nèi)存創(chuàng)建該引用(c1),在堆內(nèi)存創(chuàng)建具體對象(new Integer(1)),并且在常量池中創(chuàng)建該對象,返回棧內(nèi)存的引用;如果有則直接返回棧內(nèi)存地址的引用。
3:== 比較說明
比較基本數(shù)據(jù)類型:值是否相等
比較引用類型:比較引用是否相等(具體點(diǎn):內(nèi)存地址引用是否相同)
4:注意點(diǎn):new Integer(int num) 和int 比較會做強(qiáng)制轉(zhuǎn)換。用new形式創(chuàng)建Integer和int比較,會將new Integer()強(qiáng)制轉(zhuǎn)換成int類型,見下圖:


5:案例:

6:jvm中常量池位置
? ? ? 1.7之前,存在于方法區(qū)。
? ? ? 1.7,存在于永久代
? ? ? 1.7之后,存在于元空間,就是pc直接內(nèi)存,因?yàn)?.8刪除了永久代。
7:equals()方法
? ? ? ?直接看Integer重寫Object的equals方法,直接比較的具體指是否相等。值相等即為true。