咱們都知道Java是面向對象編程語言,包含了8種基本數據類型,可是這8種基本數據類型並不支持面向對象的特徵,它們既不是類,也不能調用方法。這在實際使用時存在不少的不便,好比int類型須要轉換成字符串,爲了解決這個不足。而後就出現了包裝類,顧名思義,就是將這些基本數據類型封裝在類中,而且提供豐富的方法來對數據進行操做。這樣八個和基本數據類型對應的類統稱爲包裝類(Wrapper Class)。java
Java中的包裝類提供了將基本數據類型轉換爲對象,以及將對象轉換爲基本數據類型的機制。編程
其中Byte,Short,Integer,Float,Double,Long都屬於Number子類。Character ,Boolean屬於Object子類。它們的默認值都是NULL。數組
①、基本數據類型轉換爲包裝類(裝箱):調用包裝類的構造器app
//基本數據類型——>包裝類:調用包裝類的構造器 @Test public void test1(){ int num=10; Integer i1=new Integer(num); System.out.println("i1結果:"+i1); Integer i2=new Integer("10"); System.out.println("i2結果:"+i2); //報錯,必須是純數字,java.lang.NumberFormatException: For input string: "10abc" //Integer i3=new Integer("10abc"); //System.out.println(i3); Double d1=new Double(12.3); Double d2=new Double("12.3"); System.out.println("d1結果:"+d1); System.out.println("d1結果:"+d2); Boolean b1=new Boolean(true); Boolean b2=new Boolean("TrUe"); Boolean b3=new Boolean("TrUe123"); System.out.println("b1結果:"+b1); System.out.println("b2結果:"+b2); System.out.println("b3結果:"+b3); }
運行結果:編程語言
從運行的結果來看,經過調用包裝類構造器能夠將基本數據類型轉爲包裝類,可是傳入的參數必須合法,不然就像Integer那樣會報錯。能夠看見Boolean包裝類傳入的字符串是忽略大寫的,這是由於構造器中調用了parseBoolean(String s)方法,而後這個方法內部又調用了String方法的equalsIgnoreCase(String anotherString)方法,因此傳入字符串會忽略大小寫。並且你傳入的是非法字符串它並不會報錯,只是返回了false,這裏須要注意一下。學習
②、包裝類轉換爲基本數據類型(拆箱):調用包裝類的Xxx的xxxValue()方法spa
//包裝類——>基本數據類型:調用包裝類的Xxx的xxxValue()方法 @Test public void test2(){ Integer integer = new Integer(10); int i=integer.intValue(); System.out.println(i+1); Double aDouble = new Double(10.11); double d=aDouble.doubleValue(); System.out.println(d+1); Boolean aBoolean = new Boolean(false); boolean b=aBoolean.booleanValue(); System.out.println(b); }
運行結果:設計
包裝類轉換爲基本數據類型是很是簡單的,只須要調用正確的方法便可,其餘的包裝類也是一樣的道理。3d
你會發現前面兩個點這樣換來換去會很是的麻煩,其實從JDK5以後就變得很是簡單了,這就要到後面介紹自動拆箱和自動裝箱。code
③、因爲出現了自動拆箱和自動裝箱,基本數據類型和包裝類就能夠當作一個總體。
基本數據類型、包裝類轉換爲字符串:調用String重載的valueOf(Xxx xxx)
//基本數據類型、包裝類->字符串:調用String重載的valueOf(Xxx xxx) @Test public void test3(){ int num=10; //方式1:鏈接運算 String str1=num+""; System.out.println("str1結果"+str1); //方式2:調用String的valueOf(Xxx xx)方法 int num1=15; String str2=String.valueOf(num1); System.out.println("str2結果"+str2); Integer integer=new Integer(21); String str3=String.valueOf(integer); System.out.println("str3結果"+str3); }
運行結果:
④、字符串轉換爲基本數據類型、包裝類:調用包裝類中的parseXxx()方法
//字符串——>基本數據類型、包裝類:調用包裝類中的parseXxx()方法; @Test public void test5(){ String str1="211"; int num=Integer.parseInt(str1); System.out.println(num); //運行報錯,ava.lang.NumberFormatException: For input string: "211abc" //String str2="211abc"; //int num1=Integer.parseInt(str2); String str3="truetrue"; boolean b=Boolean.parseBoolean(str3); System.out.println(b); }
運行結果:2十一、false。
不管怎樣轉換,數據的格式必須是正確的,不然就會報錯,boolean特殊點,返回的是false。
最後它們三者的轉換能夠詳細歸結爲:
一、基本數據類型與包裝類之間轉換:直接使用自動裝箱和自動拆箱(後面會講到,很是簡單)。
二、基本數據類型、包裝類轉換爲字符串:調用String的valueOf(Xxx xxx)方法。
三、字符串轉換爲基本數據類型、包裝類:調用包裝類的parseXxx()方法。
另外包裝類中還有豐富的方法可供你們調用,如需學習能夠自行查看包裝類的API。
將基本數據類型變成包裝類稱爲裝箱,將包裝類的類型變爲基本數據類型稱爲拆箱。
在JDK1.5以後,Java提供了自動裝箱和自動拆箱功能。
下面來看一下案例:
@Test public void test6(){ int i=21; Integer integer=i;//自動裝箱 int j=integer;//自動拆箱 double d=21.11; Double aDouble=d; double e=aDouble; }
因爲出現了自動裝箱和自動拆箱功能,因此基本數據類型和包裝類之間的相互轉換變得很是簡單,不再用去調用繁瑣的方法了。
可是也會出現一些特殊的狀況,案例以下:
@Test public void test7(){ Integer a=127; Integer b=127; System.out.println(a == b); Integer c=128; Integer d=128; System.out.println(c == d); }
運行結果:
運行的結果確定會有很大的疑問?一樣是兩個int型自動裝箱爲包裝類進行比較,爲何127比較返回是true,而128比較則返回了false。這是爲何呢?這與Java的Integer類的設計有關,查看Integer類的源代碼,以下所示。
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. } } //將127賦給high變量 high = h; //定義長度爲256的Integer數組 cache = new Integer[(high - low) + 1]; int j = low; //執行初始化,建立-128~127的Integer實例,並放入cache[]數組中 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() {} }
從上面代碼能夠看出,Integer類中定義了一個IntegerCache內部類,內部類中定義了一個靜態常量的Integer cache [ ]數組,而這個數組存儲了從-128~127之間的整數自動裝箱成Integer實例,若是咱們使用自動裝箱的方式,給Integer包裝類賦值時,範圍在-128~127之間,就能夠直接使用數組中的元素,由於-128~127之間的同一個整數自動裝箱成Integer實例時,永遠是引用cache數組的同一個數組元素。若是超出了這個範圍,自動裝箱須要再從新new對象,因此就出現了程序中的運行結果。
一、包裝類的默認值都是NULL。
二、基本數據類型、包裝類、字符串之間的轉換能夠歸結爲:
三、Integer類中默認存放值的範圍是-128~127之間。