1.Integer. valueOf()方法的作用
?Integer. valueOf()可以將基本類型int轉換為包裝類型Integer,或者將String轉換成Integer,String如果為Null或“”都會報錯
看下面代碼示例
取值為127時
?
?
取值為128時
?
為什么會是這樣呢?
首先,我們看一下雙等號“ == ”和equals()方法的不同之處。
雙等號“ == ”,對于基本數據類型,比較的是它們的值。
對于非基本類型,比較的是它們在內存中的存放地址,或者說是比較兩個引用是否引用內存中的同一個對象。
equals()是在Object基類中定義的方法。
這個方法的初始行為是比較對象的內存地址,但在一些類庫中,這個方法被覆蓋掉了,如String,Integer,Date等。在這些類當中equals有其自身的實現,而不再是比較類在堆內存中的存放地址了。
對于復合數據類型之間進行equals比較,在沒有覆寫equals方法的情況下,它們之間的比較還是基于他們在內存中的存放位置的地址值的,因為Object的equals方法也是用雙等號“ == ”進行比較的,所以比較后的結果跟雙等號“ == ”的結果相同。
?
?
?
看下源碼:
?
?
從下面的源碼可以看出,valueOf()在返回之前,會進行判斷,判斷當前 i的值是否在 -128到127之間。
如果存在,則直接返回引用,不再重新開辟內存空間。
如果不存在,就創建一個新的對象。
利用緩存,這樣做既能提高程序執行效率,還能節約內存。
?
在Integer類裝載入內存時,把[-128, 127]范圍內的整型數據裝包成Integer類,并將其對應的引用放入到cache數組中。
從上面的源碼可以看出,valueOf()在返回之前,會進行判斷,判斷當前 i的值是否在 -128到127之間。
如果存在,則直接返回引用,不再重新開辟內存空間。
如果不存在,就創建一個新的對象。
利用緩存,這樣做既能提高程序執行效率,還能節約內存。
Integer a1= 127; Integer a2?= 127; 因為 IntegerCache中已經存在此對象,直接返回引用,引用相等并且都指向緩存中的數據,所以這時候a1 == a2返回true。
Integer a1 = 128; Integer a2 = 128;因為a1,a2的值大于127,不在[-128, 127]范圍內,所以虛擬機會在堆中重新new一個 Integer對象來存放128,創建兩個對象就會產生兩個這樣的空間。兩個空間的地址不同,返回到棧中的引用的值也就不同,所以這時候a1 == a2返回false。
?