1. 程式人生 > >基本資料型別與其包裝型別

基本資料型別與其包裝型別

---- 基本型別 與 包裝型別

   Java 中預定義了八種基本資料型別,包括:byte,int,long,double,float,boolean,char,short。基本型別與物件型別最大的不同點在於,基本型別基於數值,物件型別基於引用

   基本型別的變數在棧的區域性變量表中直接儲存的具體數值,而物件型別的變數則儲存的堆中引用。顯然,相對於基本型別的變數來說,物件型別的變數需要佔用更多的記憶體空間

    

 

---- 筆試結合

   在jdk1.5以後,開始引入自動裝箱和拆箱的操作,例如:

public static void main(String[] args){
    int age = 21;
    Integer integer = age;              //自動裝箱  相當於 Integer integer = new Integer(age);
    int num = integer;                  //自動拆箱  相當於  int num = integer.intValue();
}

   當然,拆裝箱是需要方法呼叫的,也就是需要棧幀的入棧出棧的,直白點說,就是耗資源,所以我們的程式中應當儘量避免大量的「拆裝箱」操作。

舉個栗子:

public static void main(String[] args){
    Integer i1 = 100;
    Integer i2 = 100;
    Integer i3 = 200;
    Integer i4 = 200;

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

結果:

true
false

分析:

   這裡就要引入Integer類 valueOf方法使用到一個叫 IntegerCache 的快取區,它能夠預設快取[-128,127] 之間的 Integer 例項,所以,當100在其快取區範圍內,會從中返回相應的值給i1,

同理,i2也是從這裡拿取的,所以他們兩個指向的是同一個地方,所以結果為 true,但是假如 i2的定義如下的話,那麼結果的比較就是為false了,因為 此時的 i1 和 i2並不在同個地方,i1變數在棧中,而 i2 是在堆裡,位置不同

Integer i2 = new Integer(100);

   而第二個輸出「false」也是很好理解的,因為 200 不再快取池快取的範圍內,所以每次呼叫 valueOf 方法都會新建一個不同的 Integer 例項。

 

舉個栗子

public static void main(String[] args){
    Double i1 = 100.0;
    Double i2 = 100.0;
    Double i3 = 200.0;
    Double i4 = 200.0;

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

結果:

false
false

分析:

   因為在 DoubleFloat  中,沒有存在有快取區這個東西,這是因為就算給定任意一個區間,都無法確定這個區間裡面有多個double型別或者float型別的值。所以,它每一個 double 型數值包裝一個新的 Double 例項,如下:

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

 

舉個栗子

public class Test8 {

    public static void main(String[] args) {
        
        Integer i = 10;
        Integer a3 = 10;
        
        Float a = 10f;
        Double c = 10.0;
        int b = 10;
        float d = 10f;
        
        System.out.println(i == d);
        System.out.println(b == d);
        System.out.println(c == b);

        System.out.println(a.equals(d));
        System.out.println(c.equals(i));
        
    }    
}

結果:

true
true
true
true
false

分析:

   這裡要需要了解一下在java中 “==” 和 equals()方法,“==”如果比較的兩者是基本數值的話,那麼比較的就是他們的值,而如果兩個都是物件變數的話,那麼比較的是他們的地址,而“equals()”方法,比較的是變數的值以及返回引數型別,所以,雖然變數a,c,b,d的數值型別不同,但是其本身的值都是相等,比較結果為true。

  所以,Integer 型別物件  和 Double 型別物件 比較,雖然數值是相同的,但是兩者是不一樣的型別,所以為false。如下:

 參考文章: 基本資料型別及包裝類