JavaRush /Java blogi /Random-UZ /Java-da ArrayList

Java-da ArrayList

Guruhda nashr etilgan
Rivojlanayotganda, qanday o'lchamdagi massivlar kerakligini oldindan aytish qiyin. Shuning uchun dastur ishlayotgan vaqtda xotirani dinamik ravishda taqsimlash funksiyasi har bir dasturlash tili uchun zarurdir. Dinamik massiv dasturni bajarish jarayonida hajmi o'zgarishi mumkin bo'lgan massivdir. Java-da bu maqsad uchun ArrayList klassi mavjud .

ArrayList klassi nima?

ArrayList - bu java.utils paketida joylashgan ro'yxat (yoki dinamik massiv) uchun mas'ul bo'lgan To'plam ramkasining bir qismi bo'lgan List interfeysining o'zgaruvchan massiv ilovasi. Ushbu sinf barcha ixtiyoriy ro'yxat operatsiyalarini amalga oshiradi va ro'yxatni saqlash uchun ishlatiladigan massiv hajmini boshqarish usullarini taqdim etadi. ArrayList dinamik massiv g'oyasiga asoslanadi. Ya'ni, elementlarni qo'shish va olib tashlash, kerak bo'lganda oshirish yoki kamaytirish qobiliyati.

ArrayList nimani saqlaydi?

Faqat mos yozuvlar turlari, har qanday ob'ektlar, shu jumladan uchinchi tomon sinflari. Satrlar, chiqish oqimlari, boshqa to'plamlar. O'rash sinflari ibtidoiy ma'lumotlar turlarini saqlash uchun ishlatiladi.

ArrayList konstruktorlari

  1. ArrayList()

    Boshlang'ich ichki massiv sig'imi = 10 bo'lgan bo'sh konstruktor.

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

    Saqlangan qiymatlar turini burchakli qavslarda ko'rsatish tavsiya etiladi. Yuqoridagi misolda - String.

  2. ArrayList(To'plam <? E>ni kengaytiradi c)

    Konstruktor boshqa to'plamni qabul qilib, o'tgan to'plam elementlari bilan yangi massiv yaratadi:

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

    Yangi ro'yxatdagi elementlarning tartibi asl nusxadagi bilan bir xil bo'ladi.

  3. ArrayList (int initialCapacity)

    Konstruktor parametri ichki massivning boshlang'ich o'lchamining qiymati.

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

    Agar yangi elementlar qo'shilganda asosiy ArrayListda bo'sh joy qolmasa, yangi kattaroq massiv yaratiladi va ma'lumotlar unga ko'chiriladi. Agar siz kodni yozishda massivda ko'p sonli elementlar qayta ishlanishini oldindan bilsangiz, optimallashtirish uchun kattaroq qiymatni belgilashingiz kerak.

ArrayList usullari

    Quyida ArrayList ning asosiy usullari keltirilgan.

  • qo'shish (E e)

    Ro'yxat oxiriga yangi element qo'shadi. -qiymatni qaytaradi boolean( to'g'ri - muvaffaqiyat, noto'g'ri - qo'shilmagan):

    ArrayList<String> list = new ArrayList<>();
    list.add("Hello");
  • qo'shish (int indeksi, E elementi)

    elementPozitsiya indeksiga element qo'shadi . Qo'shilganda, ko'rsatilgan indeksning o'ng tomonidagi barcha elementlar o'ngga 1 pozitsiyaga siljiydi:

    list.add(0, "Amigo");

    Elementni roʻyxatning istalgan joyiga kiritish kerak boʻlganda juda foydali, lekin ArrayList boshi va oʻrtasiga tez-tez qoʻshish operatsiyalari uchun unchalik yaxshi tanlov boʻlmasligi mumkin – LinkedList-ga qarash kerak.

  • addAll(To'plam <? E> to'plamini kengaytiradi)

    To'plamning barcha elementlarini to'plamda paydo bo'ladigan tartibda ro'yxatga qo'shadi.

  • addAll(int indeksi, Collection <? E> to'plamini kengaytiradi)

    Добавление всех элементов 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'da ArrayList usullari JavaRush kursida o'rganiladi. Birinchi tanishuv Java sintaksisi kvestining yettinchi darajasida, “ArrayList Class” ma’ruzasida bo‘lib o‘tadi . Xuddi shu darajada vazifalar to'plami mavjud - bir va ikkita , ularda ArrayList usullaridan foydalanish kerak, ArrayList va generiklar bilan ishlashning qo'shimcha misollari keltirilgan va ArrayList va LinkedList o'rtasidagi farq tushuntirilgan. Bu keng qamrovli o'rganish mavzusidir, shuning uchun u yoki bu shaklda Java-dagi Arraylist (bu sinfning usullari chuqur o'rganishga arziydigan barcha bilimlarning faqat bir qismidir) quyidagi darajalarda kursga qaytariladi. treningning - Yadro, To'plamlar, Multithreading. Kod yozishning kundalik amaliyoti dasturlash muvaffaqiyatining asosiy kaliti ekanligiga ishonamiz. Shuning uchun JavaRush-ning 80% amaliy vazifalar, mini-loyihalar va o'yin vazifalaridan iborat. Bularning barchasi sizning mahoratingizni oshirishga yordam beradigan yuzlab soatlik kodlashdir.

Qo'shimcha o'qish uchun havolalar

  1. Java tilida o'z rolini bajaradigan dinamik massivlar , aniqrog'i ArrayListva haqida batafsil maqola.LinkedList
  2. ArrayList dan elementlarni olib tashlash haqida maqola .
  3. Diagramma va rasmlarda ArrayList bilan ishlash bo'yicha ma'ruza .
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION