什麼是自動拆裝箱:
假設我們想定義乙個整型的陣列列表(集合),而尖括號裡的型別不允許是基本資料型別,也就是說,不允許寫成arraylist,這裡就必須用到integer類.像這樣的情況,需要將int這樣的基本資料型別轉換為物件.所有的基本型別都有乙個與之對應的類.例如:integer對應的基本資料型別int.通常這些型別稱之為包裝器.他們的名字和基本資料型別有些小的差別:integer,long,float,double,short,byte,character,void和boolean(前6個都派生於公共的超類number).物件包裝器是不可變的,一旦構造了包裝器,就不允許更改包裝在其中的值(這句話很重要).
下面看一段**:
我們發現用同樣的方法得到的值不一樣.首先這是乙個自動裝箱的過程,這個過程是呼叫的integer類的integer valueof(int i)方法,看一下這個方法的原始碼:
通過這段**我們大致的知道:傳進來的int數 i 在integercache.low和integercatch.high的時候就直接返回陣列中的物件,在這個返回外的時候會呼叫integer的構造方法,在堆記憶體中建立乙個新的物件.這個範圍具體是多少呢?我們繼續看下面的**:
所以自動裝箱的過程是這樣的:當被裝箱的int型別值為-128~127這個範圍的時候是直接在快取中(常量池)取值,在這個範圍外的就需要new物件了.
弄清楚了這個我們在來看本文最初的**就很簡單了: i 和 j 比較的時候是在-128~127這個範圍內的,所以都是在常量池裡面取,所以是相等的.當 c 和 d 比較的時候,沒有在此範圍內,c d 都在對記憶體中開闢了空間,位址值也不一樣,所以結果是false
另外在來看看下面的**:
相信大家都很容易看出來為什麼輸出 a 的時候是 3,是因為基本資料型別傳參的時候是傳的值,那麼為什麼輸出 b 的時候會是 250 呢? 在本文的最初寫了一句話:物件包裝器是不可變的,一旦構造了包裝器,就不允許更改包裝在其中的值,所以我們不能用包裝類來實現修改數值的方法.實在想要修改就參照下面的:
Integer 和int的區別
1.int是基本的資料型別,直接存數值 2.integer是int的封裝類 integer 是物件,用乙個引用指向這個物件 integer 是乙個類,是int的擴充套件,定義了很多的轉換方法。3.int和integer都可以表示某乙個數值 4.int和integer不能夠互用,因為他們兩種不同的資料...
int和Integer的區別
今天有個學弟問了我乙個面試題 integer a 128 integer b 128 system.out.println a b 輸出什麼?為什麼?說來慚愧,我的直覺告訴我會輸出flase,但突然間還想不出來為什麼。所以寫了個例子研究了下 public static void main strin...
Integer和int的比較
package com.mawei.www public class integertest 和 equals的差異 private static void mytest01 確認有效範圍 private static void mytest02 混合比較 private static void m...