【130天】尚學堂高淇Java300集視頻精華筆記(63-64)

第63集:經常使用類包裝類IntegerNumberJDK源碼分析

基本數據類型的包裝類

  1. JAVA並非純面向對象的語言。Java語言是一個面向對象的語言,可是Java中的基本數據類型倒是不面向對象的。可是咱們在實際使用中常常須要將基本數據轉化成對象,便於操做。好比:集合的操做中。例如使用Map對象要操做put()方法時,須要傳入的參數是對象而不是基本數據類型。java

  2. 爲了解決這個不足,在設計類時爲每一個基本數據類型設計了一個對應的類進行表明,這樣八個和基本數據類型對應的類統稱爲包裝類(Wrapper Class)。緩存

  3. 包裝類均位於java.lang包,包裝類和基本數據類型的對應關係以下表所示:
    app

  4. 在這八個類名中,除了Integer和Character類之後,其它六個類的類名和基本數據類型一直,只是類名的第一個字母大寫便可。源碼分析

包裝類的用途

  1. 做爲和基本數據類型對應的類的類型存在,方便涉及到對象的操做。測試

  2. 包含每種基本數據類型的相關屬性如最大值、最小值等,以及相關的操做方法(這些操做方法的做用是在基本類型數據、包裝類對象、字符串之間提供轉化!)。spa

包裝類的共同方法

全部的包裝類(Wrapper Class)都有共同的方法,他們是:設計

/**
 * 測試Integer的用法,其餘包裝類相似
 */
 
package com.test063;

public class Test063 {
    public static void main(String[] args){
    
        //基本類型轉換成爲Integer類型
        Integer int1 = new Integer(10);
        Integer int2 = Integer.valueOf(10);
        
        //Integer對象轉換成int類型
        int int3 = int1.intValue();
        
        //字符串轉化成Integer對象
        Integer int4 = new Integer("234");
        
        //Integer對象轉換爲字符串
        String str1 = int2.toString();
        
        //一些常見的int類型相關的常量
        System.out.println("int能表示的最大整數:"+ Integer.MAX_VALUE);//正2的31次方
        System.out.println("int能表示的最小整數:"+ Integer.MIN_VALUE);//負2的31次方
        
        //數值轉換位字符串
        String str = 234 +"";
        System.out.println(str);
        
    }
}

第64集:經常使用類/自動裝箱和拆箱/緩存處理

自動裝箱和拆箱的含義(autoboxing,unboxing)

就是編譯器將基本類型和包裝類進行自動的互相轉換。JDK5.0後,將自動裝箱/拆箱引入java中。
   code

自動裝箱和拆箱的過程    


  1. 自動裝箱的過程:每當須要一種類型的對象時,這種基本類型就自動地封裝到與它相同類型的包裝中。對象

  2. 自動拆箱的過程:每當須要一個值時,被裝箱對象中的值就被自動地提取出來,不必再去調用intValue()和doubleValue()方法。rem

自動裝箱與拆箱的功能事實上是編譯器來幫您的忙,編譯器在編譯時期依您所編寫的語法,決定是否進行裝箱或拆箱動做。例如:

Integer i = 100;
// 至關於編譯器自動爲您做如下的語法編譯:
Integer i = new Integer(100);

自動裝箱和拆箱現象存在的證實

  1. 自動裝箱與拆箱的功能是所謂的「編譯器蜜糖」(Compiler Sugar),雖然使用這個功能很方便,但在程序運行階段您得了解Java的語義。例以下面的程序是能夠經過編譯的:

    Integer i = null;
    int j = i;
    
    //這樣的語法在編譯時期是合法的,可是在運行時期會有錯誤,由於這種寫法至關於:
    
    Integer i = null;
    int j = i.intValue();
  2. null表示i沒有參考至任何的對象實體,它能夠合法地指定給對象參考名稱。因爲實際上i並無參考至任何的對象,因此也就不可能操做intValue()方法,這樣上面的寫法在運行時會出現NullPointerException錯誤。

/**
 * 測試自動裝箱和拆箱
 * 結論:雖然很方便,可是若是不熟悉特殊狀況,可能會出錯!
 */
 
static void testBoxing(){
Integer b = 23;    //自動裝箱
int a = new Integer(20);    //自動拆箱
 

//自動裝箱和拆箱,其實是編譯器替咱們完成了代碼的自動編譯,好比:Integer b = 23, 其實運行時執行的仍然是:Integer b = new Integer(23);

//自動裝箱拆箱時,對於-128-127之間的值,編譯器仍然會把它當作基本類型處理。
Integer h = 100; Integer u = 100;
Integer h2 = 200; Integer u2 = 200;
if(h==u){
System.out.println("100等於");
}
if(h2==u2){
System.out.println("200等於");
}

}

自動拆裝箱的範圍

//注意一個自動拆裝箱的範圍,在[-128,127]這個區間,編譯器仍然將數值做爲基本類型,而非一個對象,這是爲了提升效率。
        Integer d1 = 1234;//等同於Integer d1 = new Integer(1234);
        Integer d2 = 1234;//等同於Integer d2 = new Integer(1234);
        System.out.println(d1==d2);    //    false
        System.out.println(d1.equals(d2));    // true
        
        Integer d3 = 123;
        Integer d4 = 123;
        System.out.println(d3==d4);// true 作字符運算時,依然看成基本數據類型處理
        System.out.println(d3.equals(d4));// true

自動裝箱和自動拆箱的課堂案例代碼

package com.test064;

public class Test064 {
    public static void main(String[] args){
        Integer i1 = new Integer(2);
        Integer i2 = 2;//JDK5.0後,編譯器幫咱們改進代碼,至關於Integer i2 = new Integer(2);
        Integer i3 = 2000;
        int c1 = i3;//自動拆箱,編譯器幫咱們改進:i3.intValue();
        System.out.println(c1);
        
        
        
    }
}
相關文章
相關標籤/搜索