JavaRush /Java Blog /Random-JA /JavaのArrayList

JavaのArrayList

Random-JA グループに公開済み
開発時には、どのサイズの配列が必要になるかを予測するのが難しいことがよくあります。したがって、プログラムの実行中に動的にメモリを割り当てる機能は、どのプログラミング言語にも必要です。動的配列とは、プログラムの実行中にサイズが変更される可能性のある配列です。Java には、この目的のためのArrayListクラスがあります。

ArrayList クラスとは何ですか?

ArrayList は、コレクション フレームワークの一部である List インターフェイスの変更可能な配列実装であり、java.utils パッケージにあるリスト (または動的配列) を担当します。このクラスは、すべてのオプションのリスト操作を実装し、リストの格納に使用される配列のサイズを制御するメソッドを提供します。ArrayList は動的配列の考え方に基づいています。つまり、必要に応じて要素を追加または削除しながら、要素を増減できる機能です。

ArrayList には何が保存されますか?

参照型、サードパーティ クラスを含む任意のオブジェクトのみ。文字列、出力ストリーム、その他のコレクション。ラッパー クラスは、プリミティブ データ型を格納するために使用されます。

ArrayList コンストラクター

  1. 配列リスト()

    初期内部配列容量 = 10 の空のコンストラクター。

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

    保存される値の種類を山括弧で囲むことをお勧めします。上の例では - String

  2. ArrayList(コレクション <? extends E> c)

    コンストラクターは別のコレクションを受け入れ、渡されたコレクションの要素を含む新しい配列を作成します。

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

    新しいリスト内の要素の順序は元のリストと同じになります。

  3. ArrayList(int 初期容量)

    コンストラクター パラメーターは、内部配列の初期サイズの値です。

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

    新しい要素が追加されたときに基になる ArrayList のスペースが不足すると、より大きな新しい配列が作成され、データがそこにコピーされます。コードを作成するときに、配列内で多数の要素が処理されることが事前にわかっている場合は、最適化のためにより大きな値を指定する必要があります。

ArrayList メソッド

    ArrayList の主なメソッドを以下に示します。

  • add(E e)

    新しい要素をリストの最後に追加します。戻りboolean値 -value ( true - 成功、false - 追加されません):

    ArrayList<String> list = new ArrayList<>();
    list.add("Hello");
  • add(int インデックス, E 要素)

    element位置インデックスに要素を追加します。追加すると、指定されたインデックスの右側にあるすべての要素が 1 位置右にシフトされます。

    list.add(0, "Amigo");

    リスト内の任意の場所に要素を挿入する必要がある場合には非常に便利ですが、ArrayList の先頭と途中で頻繁に挿入操作を行う場合は、あまり良い選択ではない可能性があります。LinkedList を検討する必要があります。

  • addAll(コレクション <? extends E> コレクション)

    コレクションのすべての要素を、コレクション内に表示される順序でリストに追加します。

  • addAll(int インデックス, コレクション <? 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 構文クエストの第 7 レベル、「ArrayList クラス」の講義で行われます。同じレベルには、 ArrayList メソッドを使用する必要があるタスクのコレクション12があり、ArrayList とジェネリックを使用する追加の例が示され、ArrayList と LinkedList の違いが説明されます。これは広範な学習トピックであるため、何らかの形で Java の Arraylist (このクラスのメソッドは、掘り下げる価値のある知識全体の一部にすぎません) は、次のレベルのコースで取り上げられます。トレーニングの - コア、コレクション、マルチスレッド。私たちは、コードを書く毎日の練習がプログラミングで成功する主な鍵であると信じています。したがって、JavaRush の 80% は実践タスク、ミニプロジェクト、ゲームタスクで構成されています。これはすべて、スキルの向上に役立つ何百時間ものコーディングです。

さらに読むためのリンク

  1. 動的配列、より正確にはArrayListJavaLinkedList言語で役割を実行する とに関する詳細な記事。
  2. ArrayList からの要素の削除に関する記事。
  3. ArrayList の操作方法を図と写真でレクチャーします。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION