1. 程式人生 > >深入理解自動裝箱和自動拆箱

深入理解自動裝箱和自動拆箱

一、什麼是自動裝箱、自動拆箱

此機制開始於jdk 1.5

java中有8種基本型別,對應8種基本型別有8個包裝類。

整形 實型 布林型 字元型
long/int/short/byte float/double boolean char
Long/Integer/Short/Byte Float/Double Boolean Character
1、自動裝箱 : 在進行運算的過程中(一般是賦值運算),基本型別的值轉換成對應包裝型別的物件。底層呼叫靜態方法Integer.valueof(int i)方法

Integer a = 1;
實際上,在編譯之後是 integer a = Integer.valueof(1)

 public static Integer valueOf(int i) {
       /**IntegerCache.low = -128 
          IntegerCache.high = 127
          IntegerCache 是Integer物件的快取器
       */
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
    

它的執行過程是這樣的:當i的值在-128到127之間時,返回的是快取器中快取的物件,否則返回的是新建立的物件。因此
Integer a = 1 ; Integer b = 1;
a==b // 結果為true,a和b都是物件,比較的是地址。

2、自動拆箱 : 在進行運算的過程中(賦值、算數、比較運算等),包裝型別的物件轉換成對應基本型別的值。底層呼叫例項方法Integer.intValue()

Integer a = new Integer(1);
int b = a;
實際上執行的是:int b = a.intValue();

 public int intValue() {
        return value;
    }

3、其他
當包裝型別和基本型別進行除賦值運算之為的運算時,包裝型別自動拆箱。這容易理解,包裝型別的變數是物件的地址,是不能進行像加減乘除等運算的。
Integer a = new Integer(1);
int b = 2;

boolean bool = a < b;
實際執行: boolean bool = a.intValue() < b;

二、練習題

public void testEquals() {

            int int1 = 12;
            int int2 = 12;
            Integer integer1 = new Integer(12);
            Integer integer2 = new Integer(12);
            Integer integer3 = new Integer(127);
            Integer a1 = 127;
            Integer a2 = 127;
            Integer a = 128;
            Integer b = 128;

            int temp = b;
            System.out.println("int1 == int2 -> " + (int1 == int2));
            System.out.println("int1 == integer1 -> " + (int1 == integer1));
            System.out.println("integer1 == integer2 -> " + (integer1 == integer2));
            System.out.println("integer3 == a1 -> " + (integer3 == a1));
            System.out.println("a1 == a2 -> " + (a1 == a2));
            System.out.println("a == b -> " + (a == b));
        }

相關推薦

深入理解自動裝箱自動

一、什麼是自動裝箱、自動拆箱 此機制開始於jdk 1.5 java中有8種基本型別,對應8種基本型別有8個包裝類。 整形 實型 布林型 字元型 long/int/short/byte float/double boolean char Lon

Java語法糖(2):自動裝箱自動

eth 空指針 lang 指針 反編譯 class path load pointer 自動拆箱和自動裝箱 Java為每種基本數據類型都提供了對應的包裝器類型。舉個例子: public class TestMain{public static void main(Strin

java基礎學習總結(十一):自動裝箱自動

自動拆箱和自動裝箱 Java為每種基本資料型別都提供了對應的包裝器型別。舉個例子: public class TestMain { public static void main(String[] args) { Integer i = 10; } }

自動裝箱自動(慎用“==”)

先來看一段非常“簡單”的程式碼 public static void main(String[] args) { Integer i1 = 100, i2 = 100, i3 = 130, i4 = 130; System.out.println(i1 == i2); S

Java的自動裝箱自動(AutoBoxing,Unboxing)

java中有8中基本的資料型別,這八種基本的資料型別都有對應的封裝型別,下面是對應關係:int——Integerfloat——Floatdouble——Doublebyte——Bytelong——Longchar——Characterboolean——Booleanshort

Java 自動裝箱自動注意的問題

        自動裝箱和自動拆箱不是什麼複雜的技術,自動裝箱就是基本型別(int,long)資料可以先自動轉換為對應的封裝類(Integer,Long)物件,而自動拆箱相反。 在本文中,筆者向大家介紹下Java中一個非常重要也非常有趣的特性,就是自動裝箱與拆箱,並從原

JavaScript基本包裝型別(自動裝箱自動)(instanceof方法)

1)為了便於操作基本型別值,ECMAScript提供了3個特殊的引用類Boolean, Number, String每當讀取一個基本型別值的時候,後臺就會建立一個對應的基本包裝型別物件,從而可以使我們呼叫一些方法操作這些資料。 在建立變數s後(var s =

全面理解java自動裝箱(轉)

sam eva android 之間 對象類型 output 壓力 有一個 sla 自動裝箱和拆箱從Java 1.5開始引入,目的是將原始類型值轉自動地轉換成對應的對象。自動裝箱與拆箱的機制可以讓我們在Java的變量賦值或者是方法調用等情況下使用原始類型或者對象類型更

自動裝箱的原理

port post csdn com details www. www art .com http://blog.csdn.net/jairuschan/article/details/7513045 http://www.importnew.com/15712.html自

自動裝箱的幾個細節

是不是 返回 之間 println 實例 eof == 常開 equal 裝箱和拆箱 裝箱和拆箱也比較簡單,我就不解釋了,直接看代碼就行了。 Integer box = 2; // 自動裝箱 System.out.println(box); // 自動拆箱 雖然裝箱拆箱簡單

淺析Java自動裝箱

  最近在面試的時候,面試官提了一個很有趣的問題,如果這樣定義:   int a = 1; Integer b = 1;你覺得a ==b?還是怎麼樣?如果換成1000呢?   當時我沒有回答的出來,按照常規的思維,我覺得Integer是一個物件,int乃是基本的

Java基礎-----JDK1.5的新特性自動裝箱

JDK1.5的新特性 1、自動裝箱:把基本型別轉換為包裝類型別。 2、自動拆箱:把包裝類型別轉換為基本型別。 注意:在使用,Integer x = null;程式碼就會出現NullPointerException。 package StringBufferPac

常見物件------JDK5的新特性自動裝箱

1.JDK5的新特性     * 自動裝箱:把基本型別轉換為包裝類型別     * 自動拆箱:把包裝類型別轉換為基本型別 2.示例     * JDK5的新特性自動裝箱和拆箱          * Integer ii = 100;     * ii += 200;3.注意事

Java 自動裝箱

裝箱就是自動將基本資料型別轉換為包裝器型別;拆箱就是自動將包裝器型別轉換為基本資料型別。 能進行裝箱與拆箱的基本型別和對應的包裝型別如下: 自動裝箱與拆箱示例程式碼: public class Tes

JAVA——包裝類的自動裝箱

關於JAVA的包裝類自動拆箱和裝箱,有很多人做過介紹,但筆者發現說的不夠簡潔,而這個問題在面試、筆試中又經常涉及,故筆者將蒐集到的資訊與大家分享下: 包裝類(原始型別對應的類,即Boolean, By

自動裝箱(包裝和解包)

自動裝箱:就是把基礎資料型別自動封裝並轉換成對應的包裝類的對象。 拆 箱 :就是把包裝類的物件自動解包並轉換成對應的基礎資料型別。 public class BoxDemo { public static void main(String[] args) {

[每日一問]---Java中支援的資料型別有哪些?什麼是自動裝箱

Java支援的資料型別包括兩種:基本資料型別、引用型別 1)基本資料型別有8種: byte、short、int、long、float、double、boolean、char 2)引用型別: 如S

java自動裝箱自動正常情況效能比較

自動裝箱和自動拆箱是java5.0版本引入的,能自動將基本型別轉換為對應的基本型別包裝物件,那麼我們比較一下他們的效能情況。 package com.wmmad.test; import junit.framework.TestCase; /** * @author ma

Integer自動裝箱比較

一、int 和Integer比較。不管Integer是直接等於一個數值,還是=new Integer(xxx);都是Integer拆箱成int,再去和前面那個int數值比較。 二、Integer和Integer比較,存在三種情況。 a.它們兩個都是直接等於一個數值, 那麼

包裝類自動裝箱原理

包裝類的自動裝箱和自動拆箱 包裝類的自動裝箱和拆箱是JDK1.5的新特性 一.首先:瞭解自動裝箱的過程 有兩種自動裝箱過程 第一種 (-128~127)之內 呼叫相應包裝類的valueOf() 例如:Integer i = 12;