JavaRush /Java Blog /Random-KO /자바의 배열리스트

자바의 배열리스트

Random-KO 그룹에 게시되었습니다
개발할 때 어떤 크기의 배열이 필요할지 예측하기 어려운 경우가 많습니다. 따라서 프로그램이 실행되는 동안 메모리를 동적으로 할당하는 기능은 모든 프로그래밍 언어에 필요합니다. 동적 배열은 프로그램 실행 중에 크기가 변경될 수 있는 배열입니다. Java에는 이러한 목적을 위한 ArrayList 클래스가 있습니다 .

ArrayList 클래스란 무엇입니까?

ArrayList는 java.utils 패키지에 있는 목록(또는 동적 배열)을 담당하는 컬렉션 프레임워크의 일부인 List 인터페이스의 변경 가능한 배열 구현입니다. 이 클래스는 모든 선택적 목록 작업을 구현하고 목록을 저장하는 데 사용되는 배열의 크기를 제어하는 ​​메서드를 제공합니다. ArrayList는 동적 배열이라는 아이디어를 기반으로 합니다. 즉, 필요에 따라 요소를 늘리거나 줄이면서 요소를 추가하고 제거하는 기능입니다.

ArrayList는 무엇을 저장하나요?

참조 유형, 타사 클래스를 포함한 모든 개체만 해당됩니다. 문자열, 출력 스트림, 기타 컬렉션. 래퍼 클래스는 기본 데이터 유형을 저장하는 데 사용됩니다.

ArrayList 생성자

  1. 배열목록()

    초기 내부 배열 용량 = 10인 빈 생성자.

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

    꺾쇠괄호 안에 저장된 값의 종류를 표시하는 것이 좋습니다. 위의 예에서 - String.

  2. ArrayList(컬렉션 <? 확장 E> c)

    생성자는 다른 컬렉션을 허용하여 전달된 컬렉션의 요소로 새 배열을 만듭니다.

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

    새 목록의 요소 순서는 원본과 동일합니다.

  3. ArrayList(intinitialCapacity)

    생성자 매개변수는 내부 배열의 초기 크기 값입니다.

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

    새 요소가 추가될 때 기본 ArrayList의 공간이 부족해지면 더 큰 새 배열이 생성되고 데이터가 여기에 복사됩니다. 코드를 작성할 때 배열에서 많은 수의 요소가 처리된다는 점을 미리 알고 있는 경우 최적화를 위해 더 큰 값을 지정해야 합니다.

ArrayList 메서드

    ArrayList의 주요 메소드는 다음과 같습니다.

  • 추가(E e)

    목록 끝에 새 요소를 추가합니다. boolean-value( true - 성공, false - 추가되지 않음) 를 반환합니다 .

    ArrayList<String> list = new ArrayList<>();
    list.add("Hello");
  • add(int 인덱스, E 요소)

    element위치 index에 요소를 추가합니다 . 추가할 때 지정된 인덱스 오른쪽에 있는 모든 요소는 오른쪽으로 한 위치 이동됩니다.

    list.add(0, "Amigo");

    목록의 아무 곳에나 요소를 삽입해야 할 때 매우 유용하지만 ArrayList의 시작과 중간에 삽입 작업을 자주 수행하는 경우에는 그다지 좋은 선택이 아닐 수 있습니다. LinkedList를 살펴봐야 합니다.

  • addAll(컬렉션 <? 확장 E> 컬렉션)

    컬렉션에 나타나는 순서대로 컬렉션의 모든 요소를 ​​목록에 추가합니다.

  • addAll(int index, Collection <? 확장 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 Class" 강의 에서 이루어집니다 . 동일한 수준에는 ArrayList 메서드를 사용해야 하는 하나두 개의 작업 컬렉션이 있으며, ArrayList 및 제네릭 작업에 대한 추가 예제가 제공되고 ArrayList와 LinkedList의 차이점이 설명됩니다. 이는 광범위한 연구 주제이므로 어떤 형태로든 Java의 Arraylist(이 클래스의 메소드는 탐구할 가치가 있는 지식 전체의 일부일 뿐입니다)가 다음 수준의 과정에서 반환됩니다. 교육 - 코어, 컬렉션, 멀티스레딩. 우리는 매일 코드를 작성하는 연습이 프로그래밍 성공의 주요 열쇠라고 믿습니다. 따라서 JavaRush의 80%는 실습, 미니 프로젝트, 게임 작업으로 구성됩니다. 이 모든 것은 당신의 기술을 향상시키는 데 도움이 되는 수백 시간의 코딩입니다.

추가 자료 링크

  1. Java 언어에서 역할을 수행하는 동적 배열 , 더 정확하게는 ArrayList및 에 대한 자세한 기사입니다.LinkedList
  2. ArrayList 에서 요소를 제거하는 방법 에 대한 기사입니다 .
  3. 다이어그램과 그림을 통해 ArrayList를 활용하는 방법을 강의합니다 .
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION