1. 程式人生 > >自動裝箱拆箱

自動裝箱拆箱

1、簡介

裝箱:自動把基本型別轉化為包裝器型別

拆箱:自動把包裝器型別轉化為基本型別

2、主要對應的包裝器型別

byte       (1位元組)      Byte

short      (2位元組)      Short

int          (4位元組)      Integer

long       (8位元組)      Long

float       (4位元組)      Float

double   (8位元組)      Double

char       (2位元組)      Char

boolean    ()            Boolean

3、實現

        以Integer為例:裝箱的時候自動呼叫的是Integer的valueOf(int)方法。拆箱的時候自動呼叫的是Integer的intValue方法,其他類似。

       Integer、Short、Byte、Character、Long這幾個類的valueOf方法的實現是類似的。例如Short,如果在-128到127之間,會走ShortCache,超過這個範圍會new物件。所以做比較時,在-128到127之間可以用“==”,超過這個範圍需要用equals,否則返回false。

    public static Short valueOf(short s) {
        final int offset = 128;
        int sAsInt = s;
        if (sAsInt >= -128 && sAsInt <= 127) { // must cache
            return ShortCache.cache[sAsInt + offset];
        }
        return new Short(s);
    }

        Double、Float的valueOf方法的實現是類似的,例如Double,呼叫的valueOf(String s):

    public static Double valueOf(String s) throws NumberFormatException {
        return new Double(FloatingDecimal.readJavaFormatString(s).doubleValue());
    }

    public static Double valueOf(double d) {
        return new Double(d);
    }

4、快取資料

        Integer、Short、Byte、Character、Long這幾個類中都有個內部快取類,Double、Float的類中沒有。

        Byte,Short,Long 有固定範圍: -128 到 127。對於 Character, 範圍是 0 到 127。除了 Integer 可以通過引數改變範圍外,其它的都不行

        以Integer為例,快取類IntegerCache,快取了-127到128的資料,不管建立多少個這個範圍內的Integer用ValueOf出來的都是同一個物件,減少了new的時間也就提升了效率。同時JDK還提供cache中high值得可配置。

        Short、Byte、Character、Long類中也實現了類似的快取類,但是沒有提供high值的配置。

    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) {
                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);
            }
            high = h;

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

        private IntegerCache() {}
    }

5、==和equals

   ==基本資料型別比較內容,實質也是比較地址(因為對於基本型別來說,當值相同的時候,地址也是相同的),物件比較比較地址。對於java中的“==”操作符號,jvm會根據兩邊互相比較的運算元的資料型別,來呼叫不同的指令。對於於boolean,byte、short、int、long這種整形運算元會生成 if_icmpne指令,該指令用於比較整形數值是否相等。如果運算元是物件的話,編譯器則會生成if_acmpne指令,與if_icmpne相比將i(int)改成了a(object reference)。

   equals是Object類中的方法,所有繼承Object的類都有此方法。Object類中,equals方法是用來比較兩個物件的引用是否相等,即是否指向同一個物件。像String中的equals都是對這個方法的重寫,比較的是所指向的物件的內容。

6、面試常問的一個問題:

Integer i = new Integer("123")和Integer i = 123;這兩種方式的區別

答:第一種方式不會觸發自動裝箱的過程,直接new物件;而第二種方式會觸發裝箱過程;


相關推薦

理解JDK1.5的自動裝箱

特性 ava 創建 幫我 max 循環 assert rally jdk1 JDK1.5的升級引入了裝箱和拆箱概念,簡單說就是為了簡化書寫。   JDK1.5之前,創建Integer對象是需要這麽寫的 Integer i = new Integer("3");   JDK

自動裝箱(Autoboxing,Unboxing)

包裝類 iter oracl ble 類型 doc section tps 技術 自動裝箱和拆箱 https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html 1.5才有(Autoboxing,Unb

Java的==和equals()以及自動裝箱

char AC oid name span 兩個 也會 掌握 word 拋一個問題 大家先看下面的代碼,先不要看答案自己做一下: public class AutoboxingTest { public static void main(String[] args)

Java的資料型別 和自動裝箱機制

Java的資料型別 和裝箱拆箱機制 資料型別 第一類整數型(byte short int long) Java各整數型有固定的表示範圍和欄位長度 ,不會受到不同作業系統的影響,這點確保了java程式的可移植性。 Java中整數型的資料預設值為int. 表示方式 十進位制:123 八

java自動裝箱特性

 http://www.cnblogs.com/dolphin0520/p/3780005.html 在Java SE5 之前,如果要生成一個數值為10的Integer物件,必須這樣進行: Integer i = new Integer(10); 而在 從Java SE5開始&nbs

JAVA自動裝箱以及裝箱時的快取問題

概述 JAVA中的自動裝箱指的是把基本型別的值轉換為對應的包裝類物件,自動拆箱則相反。 JAVA中的基本型別: boolean/1, byte/8, char/16, short/16, int/32, long/64,float/32, double/64 基本型別都

基本型別包裝類、自動裝箱

基本型別包裝類 public class Demo03 { public static void main(String[] args) { //字串轉基本資料型別 String str="12"; int strint=Integer.p

自動裝箱

1、簡介裝箱:自動把基本型別轉化為包裝器型別拆箱:自動把包裝器型別轉化為基本型別2、主要對應的包裝器型別byte       (1位元組)      Byteshort      (2位元組)      Shortint          (4位元組)      Intege

integer自動裝箱&String記憶體分配測試

int i1 = 1; int i2 = 1; System.out.println("i1==i2 : " + (i1 == i2)); // true

java自動裝箱總結

對於java1.5引入的自動裝箱拆箱,之前只是知道一點點,最近在看一篇部落格時發現自己對自動裝箱拆箱這個特性瞭解的太少了,所以今天研究了下這個特性。以下是結合測試程式碼進行的總結。 測試程式碼: int a = 1;

1.5新特性靜態匯入、增強for、可變引數、自動裝箱、列舉

第一  靜態匯入 一、概述: 1、import語句:是匯入一個類或某個包中的所有類。 2、import static語句:匯入一個類中的某個靜態方法或所有靜態方法。 3、特點:簡化了書寫,但是程式碼的閱讀性較差。 import static java.lang.M

java中的自動裝箱

/** * 自動裝箱,將基本型別轉化為物件 */ Integer autoboxingInt = 10; //以上的宣告就是用到了自動的裝箱:解析為:Integer autoboxingInt = new Integer(10); //9是屬於基本資料

Java之集合初探(二)Iterator(叠代器),collections,打包/解包(裝箱),泛型(Generic),comparable接口

基本 generate 等於 框架 ring bin list() each 是否 Iterator(叠代器) 所有實現了Collection接口的容器都有一個iterator方法, 用來返回一個實現了Iterator接口的對象 Iterator對象稱作叠代器, 用來

裝箱

print static write otf obj highlight new 文件寫入 tput 步驟 :裝箱(1)先將數據裝箱實體對象.    (2)多個實體對象在裝箱給實體.    (3)實體集合在保存到文件拆箱:(1)先將文件中的數據拆給集合    (2)集合拆

C#中的裝箱

局部變量 bsp -s spa clas 發生 app 拆箱 b-s 在C#中,經常需要把值類型和引用類型相互轉換。 首先明確兩條法則: 1.引用類型總是被分配到“堆”上。 2.值類型總是分配到它聲明的地方: a.作為引用類型的成員變量分配到“堆”上 b.作

Java支持的數據類型有哪些?什麽時候自動

回來 ring 但是 cache rep 位置 ++ 提高 自動拆箱 java中的8種基本數據類型:boolean byte char short int float double long 自動拆裝箱的問題引入: 由於在一開始學習java的時候,”萬物皆對象“這種

消息機制的優化----------無需進行裝箱/的 版本

我們 bug try clas email 引用類型 為什麽 cli small 消息機制的優化----------無需進行裝箱/拆箱的 版本 http://www.manew.com/thread-111056-1-1.html 裝箱/拆箱為了解釋“為什麽不用o

教學-44 命名空間和裝箱

add 不同 ace 封裝 text 類庫 store linq source 曾英-C#教學-44 命名空間和裝箱拆箱 目錄 1\認識命名空間,學習如何定義使用命名空間 2\學習如何使用幫助 3\理解裝箱和拆箱操作 1\命名空間 以下都是.Net內

java之裝箱

img 類類型 需要 子類 ble package static ger 編譯錯誤 參考http://how2j.cn/k/number-string/number-string-wrap/22.html 封裝類 所有的基本類型,都有對應的類類型 比如int對應的類是In

可變引數 裝箱

<span style="font-size:18px;">/* 可變引數要注意的事項: 呼叫該方法時候,可以傳遞引數也可以不傳 可變引數是一個數組物件 可變引數必須位於最後一個 一個函式最多隻能有一個可變引數,因為可變引數必須在形參中的最後一個 */