JavaRush /Java Blog /Random-TW /Java 中的陣列列表

Java 中的陣列列表

在 Random-TW 群組發布
開發時,通常很難預測需要什麼大小的陣列。因此,程式運行時動態分配記憶體的功能對於每種程式語言都是必需的。動態數組是一種其大小在程式執行期間​​可以改變的陣列。在Java中,有一個ArrayList類別用於此目的。

什麼是ArrayList類別?

ArrayList 是 List 介面的可變數組實現,是 Collection Framework 的一部分,負責位於 java.utils 套件中的列表(或動態數組)。此類別實作所有可選清單操作,並​​提供控制用於儲存清單的陣列大小的方法。ArrayList是基於動態數組的想法。即,能夠新增和刪除元素,同時根據需要增加或減少。

ArrayList儲存什麼?

僅引用類型、任何對象,包括第三方類別。字串、輸出流、其他集合。包裝類別用於儲存原始資料類型。

數組列表建構函數

  1. 數組列表()

    初始內部數組容量 = 10 的空構造函數。

    ArrayList<String> list = new ArrayList<>();

    建議在尖括號中指明儲存值的類型。在上面的例子中 - String.

  2. ArrayList(集合 <? 擴展 E> c)

    建構子接受另一個集合,使用傳遞的集合的元素建立一個新數組:

    ArrayList<String> list2 = new ArrayList<>(list);

    新清單中元素的順序將與原始清單相同。

  3. ArrayList(int 初始容量)

    建構函數參數是內部陣列的初始大小的值。

    ArrayList<String> list2 = new ArrayList<>(10000);

    如果新增元素時底層 ArrayList 空間不足,則會建立一個更大的新陣列並將資料複製到其中。如果您在編寫程式碼時提前知道將在陣列中處理大量元素,則應該指定一個更大的值以進行最佳化。

數組列表方法

    下面是ArrayList的主要方法。

  • 添加(E e)

    將新元素新增到列表末尾。傳回boolean值(true - 成功,false - 未新增):

    ArrayList<String> list = new ArrayList<>();
    list.add("Hello");
  • 新增(int索引,E元素)

    element在位置索引處新增一個元素。新增時,指定索引右側的所有元素都向右移動 1 個位置:

    list.add(0, "Amigo");

    當您需要在清單中的任何位置插入元素時非常有用,但對於 ArrayList 的開頭和中間的頻繁插入操作可能不是一個很好的選擇 - 您應該查看 LinkedList。

  • addAll(集合 <? 擴充 E> 集合)

    依照集合中出現的順序將集合的所有元素加入到清單中。

  • addAll(int index, Collection <? extends E> 集合)

    Добавление всех элементов collection в список начиная с индекса index. При этом все элементы сдвинутся вправо на количество элементов в списке collection:

    ArrayList<String> secondList = new ArrayList<>();
    secondList.addAll(list);
    System.out.println("First addition: " + secondList);
    secondList.addAll(1, list);
    System.out.println("Second addition in the middle: " + secondList);

    Вывод:

    
    Первое добавление: [Amigo, Hello]
    Второе добавление в середину: [Amigo, Amigo, Hello, Hello]

    Методы addAll() также возвращают boolean-результат добавления элементов.

  • clear()

    Удаление всех элементов из списка.

  • clone()

    returns an object-копию массива:

    ArrayList<String> copyOfSecondList = (ArrayList<String>) secondList.clone();
    secondList.clear();
    System.out.println(copyOfSecondList);

    Вывод:

    
    [Amigo, Amigo, Hello, Hello]

    Следует обратить внимание, что метод clone() возвращает Object, так что после его вызова потребуется сделать приведение к необходимому классу.

    При клонировании создается новый независимый an object. В примере показано, How очищение клонированного an object не сказалось на составе его клона.

  • contains(Object o)

    Проверка наличие an object в списке, возвращает boolean-meaning.

    System.out.println(copyOfSecondList.contains("Hello"));
    System.out.println(copyOfSecondList.contains("Check"));

    Вывод:

    
    true
    false
  • ensureCapacity(int minCapacity)

    Увеличивает размер внутреннего массива, чтобы в него поместилось количество элементов, переданных в minCapacity. Если массив достаточно вместителен, ниHowие преобразования не производятся.

    Этот метод полезен, когда возникает потребность вместить большое количество элементов в несколько итераций. Например, при создании списка емкость его внутреннего массива — 10. При загрузке данных по сети они обрабатываются асинхронно порциями и результаты помещаются в массив. Если ожидается доставка 10 000 элементов, может быть неэффективно просто добавлять эти данные каждый раз: достаточно будет в начале обработки вызвать метод ensureCapaciry(10000) и записывать туда данные по мере необходимости.

  • forEach(Consumer<? super E> action)

    Обработать в цикле ArrayList можно стандартными способами, цикл for:

    // First way
    for(int i = 0; i< secondList.size(); i++) {
       System.out.println(secondList.get(i));
    }
    И цикл for-each:
    // Second way
    for(String s : secondList) {
       System.out.println(s);
    }

    В классе ArrayList есть метод для обработки каждого element, который называется также, forEach. В качестве аргумента передается реализация интерфейса Consumer, в котором нужно переопределить метод accept():

    secondList.forEach(new Consumer<String>() {
       @Override
       public void accept(String s) {
           System.out.println(s);
       }
    });

    Вывод:

    
    Amigo
    Amigo
    Hello
    Hello

    Метод accept принимает в качестве аргумента очередной элемент того типа, который хранит в себе ArrayList. Пример для Integer:

    ArrayList<Integer> integerList = new ArrayList<>();
    integerList.forEach(new Consumer<Integer>() {
       @Override
       public void accept(Integer integer) {
           System.out.println(integer);
       }
    });

    Метод action() будет выполнен для каждого element.

  • get(int index)

    returns элемент, который расположен в указанной позиции списка.

    Если index < 0 or index >= максимального количества элементов списка, будет выброшено исключение IndexOutOfBoundsException.

    Это основной метод получения element из списка, время извлечения element по индексу всегда будет одинаковым, независимо от размера ArrayList.

  • indexOf(Object o)

    Метод возвращает индекс первого вхождения element в списке. Если element не существует в списке, метод вернет -1.

  • isEmpty()

    Метод возвращает true, если список пустой, false в обратном случае.

    Если в списке содержатся только элементы null, метод вернет false. Иными словами, null элементы также учитываются этим методом.

  • iterator()

    returns итератор для списка для последующего использования в цикле or при любой другой обработке.

    Итератор для ArrayList — fail-fast. Это значит, что если коллекция изменится во время итерации, будет выброшено исключение ConcurrentModificationException. Подробнее об fail-fast и его противоположности fail-safe можно почитать здесь.

  • lastIndexOf(Object o)

    Функционал метода похож на indexOf(), отличие в том, что возвращается индекс последнего element в списке.

    Если элемент не найден, также возвращает -1.

  • remove(int index)

    Удаление element в указанной позиции индекса. После удаления сдвигает все элементы влево для заполнения освободившегося пространства.

    Если index<0 or >= количество элементов списка, будет выброшено исключение IndexOutOfBoundsException. В результате метод возвращает элемент, который был удален.

  • remove(Object o)

    Метод удаляет из списка переданный элемент o. Если элемент присутствует в списке, он удаляется, а все элементы смещаются влево. Если элемент существует в списке и успешно удален, метод возвращает true, в обратном случае — false.

  • removeAll(Collection<?> c)

    Если необходимо удалить несколько элементов, не стоит делать это в цикле по условию: гораздо удобнее и безопаснее воспользоваться методом removeAll(). Он принимает коллекцию элементов, которая будет удалена из списка.

    Коллекция должна содержать элементы того же типа, которые хранит целевой список. В обратном случае будет выброшен ClassCastException. Метод вернет true, если список был изменен в результате вызова метода.

  • set(int index, E element)

    Замена element в указанной позиции index на переданный element. Индекс также должен быть больше нуля и меньше индекса последнего element, иначе будет выброшено исключение IndexOutOfBoundsException.

  • size()

    Лучший способ (практически единственный) для того, чтобы узнать размер массива.

  • sort(Comparator<? super E> c)

    Сортировка списка по заданному правилу. Правило сортировки представляет собой реализованный интерфейс Comparator с переопределенным методом compareTo().

    Переопределение нужно, если коллекция содержит an objectы собственного класса. При работе со стандартными классами (Integer, String и так далее) переопределение compareTo() требуется только для нестандартной сортировки.

  • toArray()

    Превращает список в фиксированный массив. Обратите внимание, что метод возвращает массив an objectов (Object[]). Если необходимо привести список в массив an objectов определенного типа, в качестве параметра в метод можно передать массив, куда будут перемещены элементы списков.

    Пример:

    String[] array = new String[secondList.size()];
    secondList.toArray(array);
    for(int i = 0; i< array.length; i++) {
       System.out.println(array[i]);
    }

    Вывод:

    
    Amigo
    Amigo
    Hello
    Hello
Java 中的 ArrayList 方法是在 JavaRush 課程中學習的。第一次相識發生在 Java 文法任務的第七級,也就是「ArrayList 類別」講座中。在同一層級上有任務集合 -,其中您需要使用 ArrayList 方法,給出了使用 ArrayList 和泛型的其他範例,並解釋了 ArrayList 和 LinkedList 之間的差異。這是一個廣泛的研究主題,因此,以某種形式,Java 中的 Arraylist(該類的方法只是值得深入研究的整個知識體系的一部分)在以下級別的課程中回歸培訓內容- 核心、集合、多線程。我們相信,日常編寫程式碼的練習是程式設計成功的關鍵。因此,JavaRush 的 80% 由實作任務、迷你專案和遊戲任務組成。所有這些都是數百小時的編碼,將有助於提高您的技能。

進一步閱讀的鏈接

  1. 一篇關於動態數組的詳細文章,或者更準確地說是關於ArrayList和 的LinkedList文章,它們在 Java 語言中發揮著各自的作用。
  2. 關於從 ArrayList 中刪除元素的文章。
  3. 關於在圖表和圖片中使用 ArrayList 的講座。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION