Java基礎(chǔ)系列(十九):自動裝箱與自動拆箱

包裝器

有些時候,我們需要把類似于int,double這樣的基本數(shù)據(jù)類型轉(zhuǎn)成對象威蕉,于是設(shè)計者就給每一個基本數(shù)據(jù)類型都配置了一個對應(yīng)的類吧寺,這些類被稱為包裝器窜管。

包裝器整體來說分為四大種:

  1. Number,Number類派生出了Integer稚机,Double幕帆,Long,F(xiàn)loat赖条,Short失乾,Byte這六個小類分別代表了int,double纬乍,long碱茁,float,short仿贬,byte這六種基本數(shù)據(jù)類型纽竣。
  2. Character,對應(yīng)的基本數(shù)據(jù)類型是char诅蝶。
  3. Void退个,對應(yīng)的是關(guān)鍵字void募壕,這個類我們會經(jīng)常在反射中看到调炬,用于表示方法的返回值是void,這里不再贅述舱馅,后面反射章節(jié)詳細(xì)講解缰泡。
  4. Boolean,對應(yīng)的是基本數(shù)據(jù)類型boolean代嗤。

要記住下面兩點包裝器的特性:

  1. 包裝器是不可變的棘钞,一旦構(gòu)造了包裝器,就不允許更改包裝在其中的值干毅。
  2. 包裝器是final定義的宜猜,不允許定義它的子類。

自動裝箱和自動拆箱

ArrayList<Integer> list = new ArrayList<>();

list.add(3);

int x = list.get(0);

自動裝箱

當(dāng)我們添加int值 到一個集合元素全部是Integer的集合中去時候硝逢,這個過程發(fā)生了什么姨拥?

list.add(3);

//實際上面的代碼會被編譯器給自動的變成下面的這個代碼
list.add(Integer.valueOf(3))

編譯器在其中所作的這個事情就叫做自動裝箱。

自動拆箱

當(dāng)我們?nèi)〕鲆粋€集合中的元素并將這個元素賦給一個int類型的值的時候渠鸽,這其中又發(fā)生了什么呢叫乌?

int x = list.get(0);

//實際上面的代碼會被編譯器給自動的變成下面的這個代碼
int x = list.get(0).intValue();

編譯器這其中所作的這個事情就叫做自動拆箱

自動裝箱和自動拆箱中的坑

Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 300;
Integer i4 = 300;

System.out.println(i1 == i2);
System.out.println(i3 == i4);

這是一道經(jīng)典的面試題,打印出來的結(jié)果是:

true
false

為什么會發(fā)生這樣的事情徽缚,我們記得自動裝箱的時候會自動調(diào)用Integer的valueOf方法憨奸,我們現(xiàn)在來看一下這個方法的源碼:

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
}

而這個IntegerCache是什么呢?

 private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
}

從這2段代碼可以看出凿试,在通過valueOf方法創(chuàng)建Integer對象的時候排宰,如果數(shù)值在[-128,127]之間似芝,便返回指向IntegerCache.cache中已經(jīng)存在的對象的引用;否則創(chuàng)建一個新的Integer對象额各。

上面的代碼中i1和i2的數(shù)值為100国觉,因此會直接從cache中取已經(jīng)存在的對象,所以i1和i2指向的是同一個對象虾啦,而i3和i4則是分別指向不同的對象麻诀。

這樣我們就不難理解為什么一個是false,一個是true了傲醉。

原創(chuàng)文章蝇闭,文筆有限,才疏學(xué)淺硬毕,文中若有不正之處呻引,萬望告知


公眾號

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吐咳,隨后出現(xiàn)的幾起案子逻悠,更是在濱河造成了極大的恐慌,老刑警劉巖韭脊,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件童谒,死亡現(xiàn)場離奇詭異,居然都是意外死亡沪羔,警方通過查閱死者的電腦和手機(jī)饥伊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔫饰,“玉大人琅豆,你說我怎么就攤上這事÷ㄓ酰” “怎么了茫因?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杖剪。 經(jīng)常有香客問我冻押,道長,這世上最難降的妖魔是什么摘盆? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任翼雀,我火速辦了婚禮,結(jié)果婚禮上孩擂,老公的妹妹穿的比我還像新娘狼渊。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布狈邑。 她就那樣靜靜地躺著城须,像睡著了一般。 火紅的嫁衣襯著肌膚如雪米苹。 梳的紋絲不亂的頭發(fā)上糕伐,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機(jī)與錄音蘸嘶,去河邊找鬼良瞧。 笑死,一個胖子當(dāng)著我的面吹牛训唱,可吹牛的內(nèi)容都是我干的褥蚯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼况增,長吁一口氣:“原來是場噩夢啊……” “哼赞庶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起澳骤,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤歧强,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后为肮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摊册,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年弥锄,在試婚紗的時候發(fā)現(xiàn)自己被綠了丧靡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟆沫。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡籽暇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饭庞,到底是詐尸還是另有隱情戒悠,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布舟山,位于F島的核電站绸狐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏累盗。R本人自食惡果不足惜寒矿,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望若债。 院中可真熱鬧符相,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蓝牲,卻和暖如春趟脂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背例衍。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工昔期, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人佛玄。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓镇眷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親翎嫡。 傳聞我的和親對象是個殘疾皇子欠动,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容