JavaRush /Blog Java /Random-PL /Lista tablic w Javie

Lista tablic w Javie

Opublikowano w grupie Random-PL
Podczas programowania często trudno jest przewidzieć, jaki rozmiar tablic będzie potrzebny. Dlatego w każdym języku programowania niezbędna jest funkcja dynamicznego przydzielania pamięci w trakcie działania programu. Tablica dynamiczna to taka, której rozmiar może zmieniać się podczas wykonywania programu. W Javie istnieje do tego celu klasa ArrayList .

Co to jest klasa ArrayList?

ArrayList to zmienna implementacja tablicowa interfejsu List, część Collection Framework, która jest odpowiedzialna za listę (lub tablicę dynamiczną) znajdującą się w pakiecie java.utils. Ta klasa implementuje wszystkie opcjonalne operacje na listach i udostępnia metody kontrolowania rozmiaru tablicy używanej do przechowywania listy. ArrayList opiera się na idei tablicy dynamicznej. Mianowicie możliwość dodawania i usuwania elementów, przy jednoczesnym zwiększaniu lub zmniejszaniu w zależności od potrzeb.

Co przechowuje ArrayList?

Tylko typy referencyjne, wszelkie obiekty, w tym klasy innych firm. Ciągi, strumienie wyjściowe, inne kolekcje. Klasy opakowujące służą do przechowywania prymitywnych typów danych.

Konstruktory ArrayList

  1. Lista tablic()

    Pusty konstruktor z początkową pojemnością tablicy wewnętrznej = 10.

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

    Wskazane jest wskazanie rodzaju przechowywanych wartości w nawiasach ostrych. W powyższym przykładzie - String.

  2. ArrayList(Kolekcja <? rozszerza E> c)

    Konstruktor akceptuje kolejną kolekcję, tworząc nową tablicę z elementami przekazanej kolekcji:

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

    Kolejność elementów na nowej liście będzie taka sama jak na oryginalnej.

  3. ArrayList(int początkowa pojemność)

    Parametr konstruktora jest wartością początkowego rozmiaru tablicy wewnętrznej.

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

    Jeśli po dodaniu nowych elementów w bazowej ArrayList zabraknie miejsca, tworzona jest nowa, większa tablica i dane są do niej kopiowane. Jeśli z góry podczas pisania kodu wiesz, że w tablicy zostanie przetworzona duża liczba elementów, powinieneś podać większą wartość w celach optymalizacyjnych.

Metody ArrayList

    Poniżej znajdują się główne metody ArrayList.

  • dodać (E e)

    Dodaje nowy element na końcu listy. Zwraca boolean-wartość ( true - sukces, false - nie dodano):

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

    Dodaje element elementw indeksie pozycji. Podczas dodawania wszystkie elementy na prawo od określonego indeksu są przesuwane o 1 pozycję w prawo:

    list.add(0, "Amigo");

    Bardzo przydatne, gdy chcesz wstawić element w dowolnym miejscu listy, ale w przypadku częstych operacji wstawiania na początku i w środku listy ArrayList może nie być zbyt dobrym wyborem - powinieneś zajrzeć do LinkedList.

  • addAll(Kolekcja <? rozszerza kolekcję E>)

    Dodaje wszystkie elementy kolekcji do listy w kolejności, w jakiej pojawiają się w kolekcji.

  • addAll(int indeks, kolekcja <? rozszerza kolekcję E>)

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

    ArrayList<String> secondList = new ArrayList<>();
    secondList.addAll(list);
    System.out.println(„Pierwszy dodatek:” + secondList);
    secondList.addAll(1, list);
    System.out.println("Drugi dodatek w środku: " + secondList);

    Вывод:

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

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

  • clear()

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

  • clone()

    zwroty obiekt-копию массива:

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

    Вывод:

    
    [Amigo, Amigo, Hello, Hello]

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

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

  • contains(Object o)

    Проверка наличие obiektа в списке, возвращает boolean-oznaczający.

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

    Вывод:

    
    true
    false
  • ensureCapacity(int minCapacity)

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

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

  • forEach(Consumer<? super E> action)

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

    // Pierwszy sposób
    for(int i = 0; i< secondList.size(); i++) {
       System.out.println(secondList.get(i));
    }
    И цикл for-each:
    // Drugi sposób
    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)

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

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

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

  • indexOf(Object o)

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

  • isEmpty()

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

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

  • iterator()

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

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

  • lastIndexOf(Object o)

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

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

  • remove(int index)

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

    Если index<0 Lub >= количество элементов списка, будет выброшено исключение 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().

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

  • toArray()

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

    Пример:

    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
Metod ArrayList w Javie można się nauczyć na kursie JavaRush. Pierwsza znajomość odbywa się na siódmym poziomie zadania Java Syntax, na wykładzie „ArrayList Class” . Na tym samym poziomie znajdują się kolekcje zadań - jeden i dwa , w których należy skorzystać z metod ArrayList, podano dodatkowe przykłady pracy z ArrayList i rodzajami generycznymi oraz wyjaśniono różnicę pomiędzy ArrayList i LinkedList. Jest to obszerny temat nauki, dlatego w takiej czy innej formie Arraylist w Javie (metody tej klasy to tylko część całej wiedzy, w którą warto się zagłębić) powraca w kursie na kolejnych poziomach szkoleń - Core, Collections, Multithreading. Wierzymy, że codzienna praktyka pisania kodu jest głównym kluczem do sukcesu w programowaniu. Dlatego 80% JavaRush składa się z zadań praktycznych, miniprojektów i zadań z gier. To wszystko to setki godzin kodowania, które pomogą udoskonalić Twoje umiejętności.

Linki do dalszej lektury

  1. Szczegółowy artykuł o tablicach dynamicznych , a dokładniej o ArrayListi LinkedList, które pełnią swoją rolę w języku Java.
  2. Artykuł o usuwaniu elementów z ArrayList .
  3. Wykład dotyczący pracy z ArrayList na diagramach i obrazkach .
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION