天天看點

Java基本資料類型包裝類及自動裝拆箱

Copyright©Stonee

面向對象語言中僅僅有基本資料類型是不夠的的,隻有基本資料類型無法對他們進行基本的操作。這就誕生了将基本資料類型包裝成類的手段,可以通過這些包裝類的各種方法對他們進行各種騷操作。

1. 八種基本資料類型

資料類型 包

  • byte ---------> Byte
  • short ---------> Short
  • int ---------> Integer
  • long ---------> Long
  • float ---------> Float
  • double ---------> Double
  • char ---------> Char
  • boolean ---------> Boolean
看一下他們的樹結構:

java.lang.Object

  java.lang.Character

  java.lang.Boolean

  java.lang.Number

   java.lang.Byte

   java.lang.Double

   java.lang.Float

   java.lang.Integer

   java.lang.Long

   java.lang.Short

2. 自動裝箱和自動拆箱

如何将基本資料和基本資料包裝類互相轉換呢?

  我們來看一個java語句:

  • 将資料類型轉換為類:

Integer n = Integer.valueOf(3);

就是通過類的valueOf方法

這個叫做裝箱
  • 将類轉換為資料類型:

int n = (Integer) xxx.intValue();

通過類的intValue方法

這個叫做拆箱

  自動裝箱和自動拆箱的意思就是編譯器會自動通過上述方法進行基本資料類型和其包裝類的轉換

如下:
Integer n = 3; // 編譯器會自動變為 Integer n = Integer.valueOf(3);

int n = a;  //a為Integer類型,編譯器會自動變為 int n = a.intValue();
           
看一個特例,當一個表達式中混合使用Integer和Double類型的時候,Integer的值就會先自動拆箱變為int,然後将int提升為double,在裝箱為Double,如下:
Integer n = 1;
Double x = 2.0;
System.out.println(true ? n : x);//會列印出1.0
           

3. 從Integer類觀察8中資料類型包的常用字段和方法

  • 常用字段
System.out.println(Integer.MAX_VALUE);        
System.out.println(Integer.MIN_VALUE);  //最大值和最小值       
           
  • 構造方法
Integer i1 = new Integer(100);
System.out.println(i1)

;Integer i2 = new Integer("100"); //但不能是“abc”
System.out.println(i2);

//構造方法已經被舍棄
           
  • 普通方法
System.out.println(String.valueOf(100));    //將int轉換為字元串        
     System.out.println(i2.toString());  //通過類轉換為字元串        
     
     //基本包裝類中有7中除了Char都有parseXxx方法,可以将字元串轉化為基本資料   
     System.out.println(Integer.parseInt("666"));  
           

4. 從一些面試題中淺學包裝類

Integer a = new Integer(100);        
    Integer b = new Integer(100);        
    System.out.println(a == b);     //false ,有兩個對象,位址不同  
    System.out.println(a.equals(b));    //true  重寫了equals方法,比較的是屬性值        
    
    Integer c = 127;        
    Integer d = 127;        
    System.out.println(c == d);     //true    引用常量池中同一個127   
    System.out.println(c.equals(d));    //true        
    
    Integer e = 128;       
    Integer f = 128;        
    System.out.println(e == f);     //false     常量池中沒有,需要新建立
    System.out.println(e.equals(f));    //true   
           
解釋第二個和第三個問題:因為-128~127是byte的取值範圍,如果在這個取值範圍内,自動裝箱就不會建立對象,而是從常量池的數組中擷取,如果超過了這個範圍,會再建立對象,可檢視valueOf源碼