1. 程式人生 > 其它 >Java核心技術讀書筆記5-3 泛型陣列列表ArrayList類與列舉類

Java核心技術讀書筆記5-3 泛型陣列列表ArrayList類與列舉類

3.泛型陣列列表

Java陣列可以不像C++那樣必須在編譯時確定長度,但Java陣列仍然是定義長度後就不可更改了。這個問題可以由ArrayList類實現動態陣列來解決。
ArrayList維護一個內部陣列,若新增元素時陣列已滿,則會常見一個更大的陣列,並把原值複製過來。
new ArrayList<>(n);代表初始容量而不是最終固定容量,若陣列確認不會變化的時候可以呼叫trinToSize()方法回收無用空間。

3.1 方法:add為插入元素,set為替換元素(若被替換位置沒有元素則會報錯),remove為移除元素。

4.物件包裝器與自動拆裝箱

包裝器的值是不可變的。對基本資料型別的包裝器進行運算實際上都是經過自動拆箱->運算->裝箱的。這些過程是編譯器負責的,實際上生成位元組碼時,編譯器會自動的插入必要方法呼叫。這些操作與虛擬機器無關,虛擬機器只負責處理生成好的程式碼。

5.引數數量可變的方法

可變參的序列必須放置在引數列表的最後部分,形式如下:

public void aMethod(int a, SomeType... args){
    ...
}

可變參的引數型別必須一致,可以是基本資料型別也可以是引用資料型別。
對於方法的呼叫者,對可變參可以傳入多個變數,也可以傳入一個數組。對於方法體內的接受者,args的形式是一個數組。

6.列舉類

列舉類相當於剛好有n個例項的類,在比較兩個列舉類值的時候直接使用"=="而不要使用equals()

public enum EnumTest {
    SMALL, //呼叫無參構造器,構造一個型別為EnumTest的列舉常量EnumTest.SMALL, 其name屬性為SMALL。
    MEDIUM("M"), //同樣構造列舉常量,但使用了有參構造器,為域abbreviation賦值為“M”
    LARGE,
    EXTRA_LARGE; //上述列舉常量,構造時用","隔開,最後一個常量後加分號;
    private String abbreviation;

    private EnumTest() {
    }

    private EnumTest(String abbreviation){
        this.abbreviation = abbreviation;
    }

    public String getAbbreviation() {
        return abbreviation;
    }
}

     /**
     * 下面為測試程式碼
     **/
    EnumTest e = EnumTest.MEDIUM;
    System.out.println(e.name()); //返回MEDIUM
    System.out.println(e.toString()); //返回MEDIUM
    System.out.println(e.getAbbreviation()); //返回域的值"M"
    EnumTest medium = Enum.valueOf(EnumTest.class, "MEDIUM"); //使用name屬性和列舉類物件構造一個列舉類物件
    System.out.println(e == medium); //true
    for (EnumTest curE : EnumTest.values()) { //返回列舉類的所有列舉常量構成的陣列
       System.out.print(curE.ordinal()+" "); //0 1 2 3 列舉常量在列舉類中定義的下標
       System.out.print(curE+" "); //SMALL MEDIUM LARGE EXTRA_LARGE
     }