Day42--ArrayList

1hahahahahahahaha發表於2024-12-07

Day42--ArrayList

  1. 定義和概念

    • ArrayList是Java集合框架中的一個重要類,它位於java.util包中。它實現了List介面,提供了一種動態大小的陣列實現,用於儲存有序的集合元素。與普通陣列不同的是,ArrayList的大小可以自動增長和收縮,這使得它在處理元素數量不確定的情況時非常方便。
  2. 建立ArrayList物件

    • 基本語法

      • 有兩種常見的建立ArrayList物件的方式。第一種是指定泛型型別並使用無參建構函式建立,例如,要建立一個儲存整數的ArrayList,可以這樣寫:
      ArrayList<Integer> list = new ArrayList<>();
      
      • 這裡ArrayList<Integer>中的Integer是泛型型別引數,表示這個ArrayList中只能儲存整數型別(int的包裝類是Integer)的元素。<>是Java 7及以後引入的菱形語法,編譯器會根據左邊宣告的型別自動推斷出ArrayList的具體泛型型別,等同於寫new ArrayList<Integer>();
      • 第二種方式是使用有參建構函式,例如可以指定初始容量來建立ArrayList。如果預先知道要儲存的元素大概數量,可以透過這種方式提高效能,程式碼如下:
      ArrayList<String> listWithCapacity = new ArrayList<>(10);
      // 這裡建立了一個初始容量為10的、儲存字串的ArrayList
      
  3. 新增元素到ArrayList

    • add方法

      • ArrayList提供了add方法用於新增元素。例如,對於前面建立的儲存整數的ArrayList,可以這樣新增元素:
      ArrayList<Integer> list = new ArrayList<>();
      list.add(1);
      list.add(2);
      list.add(3);
      
      • add方法有兩個過載形式,一種是隻傳入要新增的元素(如上面的例子),元素會被新增到列表的末尾。另一種形式是可以指定插入元素的位置,例如add(int index, E element),其中index是要插入的位置索引,element是要插入的元素。需要注意的是,索引是從0開始的,而且插入元素時,會將指定索引位置及之後的元素向後移動一個位置。例如:
      ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
      list.add(1, 4); 
      // 在索引為1的位置插入元素4,此時list變為[1, 4, 2, 3]
      
  4. 訪問ArrayList中的元素

    • 透過索引訪問

      • 可以像訪問陣列元素一樣訪問ArrayList中的元素,使用索引來獲取指定位置的元素。例如:
      ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
      int element = list.get(0); 
      // 獲取索引為0的元素,這裡element的值為1
      
      • 這裡使用了get方法,它接收一個索引引數,返回該索引位置對應的元素。如果索引超出範圍(小於0或者大於等於ArrayList的大小),會丟擲IndexOutOfBoundsException異常。
  5. 修改ArrayList中的元素

    • 透過索引修改

      • 可以使用索引來修改ArrayList中的元素,例如:
      ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
      list.set(1, 4); 
      // 將索引為1的元素修改為4,此時list變為[1, 4, 3]
      
      • 這裡使用了set方法,它接收兩個引數,第一個引數是要修改的元素的索引,第二個引數是新的元素值。如果索引超出範圍,同樣會丟擲IndexOutOfBoundsException異常。
  6. 刪除ArrayList中的元素

    • remove方法

      • ArrayList提供了幾種方式來刪除元素。一種是透過元素的值來刪除,例如:
      ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
      list.remove(Integer.valueOf(2)); 
      // 從列表中刪除值為2的元素,此時list變為[1, 3]
      
      • 這裡remove方法會刪除第一個匹配到的指定元素,它會呼叫元素的equals方法來判斷元素是否相等。
      • 另一種方式是透過索引來刪除元素,例如:
      ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
      list.remove(0); 
      // 刪除索引為0的元素,此時list變為[2, 3]
      
      • 當透過索引刪除元素時,索引之後的元素會向前移動一個位置。同樣,如果索引超出範圍,會丟擲IndexOutOfBoundsException異常。
  7. 獲取ArrayList的大小

    • size方法

      • 可以使用size方法來獲取ArrayList中當前儲存的元素個數,例如:
      ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
      int size = list.size(); 
      // size的值為3
      
  8. 遍歷ArrayList

    • 使用for迴圈

      • 可以使用傳統的for迴圈透過索引來遍歷ArrayList,例如:
      ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
      for (int i = 0; i < list.size(); i++) {
          System.out.println(list.get(i));
      }
      
      • 這種方式在需要使用索引進行操作或者在迴圈過程中可能會修改列表大小的情況下比較有用。
    • 使用增強for迴圈(foreach

      • 也可以使用增強for迴圈來更簡潔地遍歷ArrayList,例如:
      ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
      for (Integer element : list) {
          System.out.println(element);
      }
      
      • 增強for迴圈會自動遍歷集合中的每個元素,不需要顯式地使用索引,程式碼更加簡潔,但在迴圈過程中不能方便地獲取元素的索引,並且如果在迴圈內部需要修改集合(如刪除元素),可能會導致ConcurrentModificationException異常,需要特別注意。
  9. ArrayList與陣列的轉換

    • ArrayList轉陣列

      • 可以使用toArray方法將ArrayList轉換為陣列。例如:
      ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
      Integer[] array = list.toArray(new Integer[0]);
      
      • 這裡toArray方法接收一個陣列作為引數,如果傳入的陣列大小足夠,就會將ArrayList中的元素填充到這個陣列中並返回;如果傳入的陣列大小為0(如上面的例子)或者小於ArrayList的大小,會建立一個新的陣列並返回。
    • 陣列轉ArrayList

      • 可以使用Arrays.asList方法將陣列轉換為ArrayList,但需要注意的是,這種方式返回的ArrayListArrays類內部的一個私有靜態內部類,它的addremove等方法會丟擲UnsupportedOperationException異常,因為它是一個固定大小的檢視,並不是真正的ArrayList。如果想要一個真正可以修改大小的ArrayList,可以這樣做:
      Integer[] array = {1, 2, 3};
      ArrayList<Integer> list = new ArrayList<>(Arrays.asList(array));
      
      • 這樣就建立了一個可以正常新增、刪除等操作的ArrayList物件,並且它的初始元素是由陣列中的元素構成的。