JavaRush /Blog Java /Random-MS /ArrayList dalam Java

ArrayList dalam Java

Diterbitkan dalam kumpulan
Apabila membangun, selalunya sukar untuk meramalkan tatasusunan saiz yang diperlukan. Oleh itu, fungsi memperuntukkan memori secara dinamik semasa program berjalan adalah perlu untuk setiap bahasa pengaturcaraan. Tatasusunan dinamik ialah tatasusunan yang saiznya boleh berubah semasa pelaksanaan program. Di Jawa, terdapat kelas ArrayList untuk tujuan ini .

Apakah kelas ArrayList?

ArrayList ialah pelaksanaan tatasusunan boleh ubah bagi antara muka Senarai, sebahagian daripada Rangka Kerja Pengumpulan, yang bertanggungjawab untuk senarai (atau tatasusunan dinamik) yang terdapat dalam pakej java.utils. Kelas ini melaksanakan semua operasi senarai pilihan dan menyediakan kaedah untuk mengawal saiz tatasusunan yang digunakan untuk menyimpan senarai. ArrayList adalah berdasarkan idea tatasusunan dinamik. Iaitu, keupayaan untuk menambah dan membuang elemen, sambil menambah atau mengurangkan mengikut keperluan.

Apakah yang disimpan oleh ArrayList?

Hanya jenis rujukan, sebarang objek, termasuk kelas pihak ketiga. Rentetan, aliran keluaran, koleksi lain. Kelas pembungkus digunakan untuk menyimpan jenis data primitif.

Pembina ArrayList

  1. ArrayList()

    Pembina kosong dengan kapasiti tatasusunan dalaman awal = 10.

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

    Adalah dinasihatkan untuk menunjukkan jenis nilai yang disimpan dalam kurungan sudut. Dalam contoh di atas - String.

  2. ArrayList(Koleksi <? memanjangkan E> c)

    Pembina menerima koleksi lain, mencipta tatasusunan baharu dengan elemen koleksi yang diluluskan:

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

    Susunan elemen dalam senarai baharu akan sama dengan yang asal.

  3. ArrayList(int initialCapacity)

    Parameter pembina ialah nilai saiz awal tatasusunan dalaman.

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

    Jika ArrayList asas kehabisan ruang apabila elemen baharu ditambahkan, tatasusunan baharu yang lebih besar akan dibuat dan data disalin ke dalamnya. Jika anda mengetahui lebih awal semasa menulis kod anda bahawa sejumlah besar elemen akan diproses dalam tatasusunan, anda harus menentukan nilai yang lebih besar untuk tujuan pengoptimuman.

Kaedah ArrayList

    Di bawah ialah kaedah utama ArrayList.

  • tambah(E e)

    Menambah elemen baharu pada penghujung senarai. Mengembalikan boolean-nilai ( benar - kejayaan, palsu - tidak ditambah):

    ArrayList<String> list = new ArrayList<>();
    list.add("Hello");
  • tambah (indeks int, elemen E)

    Menambah elemen elementpada indeks kedudukan. Apabila menambah, semua elemen di sebelah kanan indeks yang ditentukan dianjakkan 1 kedudukan ke kanan:

    list.add(0, "Amigo");

    Sangat berguna apabila anda perlu memasukkan elemen di mana-mana dalam senarai, tetapi untuk operasi pemasukan yang kerap pada permulaan dan tengah ArrayList mungkin bukan pilihan yang sangat baik - anda harus melihat ke LinkedList.

  • addAll(Koleksi <? memanjangkan koleksi E>)

    Menambahkan semua elemen koleksi pada senarai mengikut susunan ia muncul dalam koleksi.

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

    Добавление всех элементов 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
Kaedah ArrayList dalam Java dipelajari dalam kursus JavaRush. Perkenalan pertama berlaku pada tahap ketujuh pencarian Java Syntax, di kuliah "ArrayList Class" . Pada tahap yang sama terdapat koleksi tugas - satu dan dua , di mana anda perlu menggunakan kaedah ArrayList, contoh tambahan bekerja dengan ArrayList dan generik diberikan, dan perbezaan antara ArrayList dan LinkedList dijelaskan. Ini adalah topik kajian yang luas, oleh itu, dalam satu bentuk atau yang lain, Arraylist di Jawa (kaedah kelas ini hanya sebahagian daripada keseluruhan badan pengetahuan yang patut dipelajari) dikembalikan ke dalam kursus di peringkat berikut latihan - Teras, Koleksi, Multithreading. Kami percaya bahawa amalan harian menulis kod adalah kunci utama kejayaan dalam pengaturcaraan. Oleh itu, 80% daripada JavaRush terdiri daripada tugas praktikal, projek mini dan tugasan permainan. Semua ini adalah beratus-ratus jam pengekodan yang akan membantu meningkatkan kemahiran anda.

Pautan untuk bacaan lanjut

  1. Artikel terperinci tentang tatasusunan dinamik , atau lebih tepat lagi tentang ArrayListdan LinkedList, yang melaksanakan peranannya dalam bahasa Java.
  2. Artikel tentang mengalih keluar elemen daripada ArrayList .
  3. Kuliah bekerja dengan ArrayList dalam rajah dan gambar .
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION