JavaRush /Java Blog /Random-KO /ArrayList 클래스의 상세 분석 [1부]
Vonorim
레벨 26

ArrayList 클래스의 상세 분석 [1부]

Random-KO 그룹에 게시되었습니다
이 기사에서는 컬렉션 프레임워크의 ArrayList 클래스를 자세히 살펴보겠습니다. 이는 일반 배열을 기반으로 하기 때문에 이해하기 가장 쉬울 것입니다. 인터뷰에서 이 클래스와 Java에서의 구현에 대한 질문을 거의 확실히 받게 될 것입니다. 두 번째 부분에서는 나머지 메소드를 분석하고 숫자에 대한 동적 배열의 구현을 자체적으로 작성합니다. ArrayList 클래스는 AbstractList 클래스에서 상속되며 List, RandomAccess, Cloneable, Serialized 인터페이스를 구현합니다. ArrayList 클래스 상세 분석 [Part 2] ArrayList 클래스의 상세 분석 [1부] - 1 ArrayList 클래스는 필요에 따라 확장 가능한 동적 배열을 지원합니다. 그 필요성과 효율성은 일반 배열의 길이가 고정되어 있다는 사실로 설명됩니다. 일단 생성되면 늘어나거나 줄어들 수 없으며, 배열의 크기가 얼마나 필요한지 알 수 없으면 제한이 적용됩니다. 기본적으로 ArrayList 클래스는 객체 참조의 가변 길이 목록 배열입니다. 내부 배열의 크기(셀 수)는 요소가 제거될 때 자동으로 줄어들지 않는다는 점을 이해하는 것이 중요합니다. 실제로 size배열에 실제로 존재하는 요소의 개수를 나타내는 변수의 값은 감소한다. ArrayList 클래스의 새 개체를 만들고 여기에 5개의 요소를 추가한다고 가정해 보겠습니다. 기본적으로 10개 요소의 배열이 생성됩니다. 이 경우 개체의 소위 용량(크기/부피)은 10이 되지만 변수 값은 size5가 됩니다. 그리고 요소를 삭제하면 ArrayList 클래스의 내부 배열에 액세스하여 해당 길이를 확인할 수 없기 size때문에 변수 값이 변경되는 것을 볼 수 있습니다. 아래에서 설명하는 .length추가 방법을 사용하여 크기를 줄일 수 있습니다 . trimToSize()클래스 필드를 살펴보겠습니다.
  • 동적 배열의 기본 볼륨을 담당하는 필드:

    private static final int DEFAULT_CAPACITY = 10

    새 객체 new ArrayList<>()(매개변수 없는 생성자)를 생성하면 내부에 10개의 요소로 구성된 배열이 생성됩니다.

  • 컬렉션의 모든 요소가 저장되는 필드:

    transient Object[] elementData

    키워드로 표시됨 transient- 표준 직렬화 알고리즘을 사용할 때 필드가 바이트 스트림에 기록되지 않습니다. 필드가 키워드로 표시되어 있지 않다는 점은 주목할 가치가 private있지만 이는 중첩 클래스(예: SubList)에서 이 필드에 대한 액세스를 용이하게 하기 위해 수행되었습니다.

  • 실제로 배열의 요소 수를 저장하는 카운터 필드:

    private int size

    삽입, 삭제 등의 작업을 수행할 때 값이 증가/감소됩니다.

클래스에 3개의 필드가 더 있지만 본질적으로 추가 필드이므로 고려할 필요가 없습니다. 클래스에는 세 가지 생성자가 있습니다.
  1. public ArrayList()– 10개 요소의 빈 목록 배열을 만듭니다.
  2. public ArrayList(Collection < ? extends E > c)– 전달된 컬렉션의 요소로 초기화된 목록 배열을 생성합니다(일부 컬렉션을 기반으로 새 ArrayList를 생성하려는 경우).
  3. public ArrayList(int initialCapacity)– 초기 용량으로 목록 배열을 생성합니다. 전달된 매개변수initialCapacity가 0보다 크면 지정된 크기의 배열이 생성됩니다(내부 필드 elementData에는initialCapacity크기의 Object 유형의 새 배열에 대한 링크가 할당됨). 매개변수가 0이면 빈 배열이 생성됩니다. 지정된 매개변수가 0보다 작으면 IllegalArgumentException이 발생합니다.
객체 생성
List < String> list = new ArrayList<>();
새로 생성된 개체에는 list속성(필드) elementData및 가 포함됩니다 size. 우리의 경우 값 저장소는 elementData특정 유형의 배열(generic – 에 지정됨)에 지나지 않습니다 . 매개변수가 없는 생성자가 호출되면 기본적으로 Object 유형의 요소 10개로 구성된 배열이 생성됩니다(물론 유형에 대한 캐스팅을 통해). 요소 추가 일반적으로 목록 배열에 요소를 추가하는 작업은 . <>String[]ArrayList 클래스의 상세 분석 [1부] - 2add()
public boolean add(E элемент)
다음을 추가해 보겠습니다. list.add("0"); ArrayList 클래스의 상세 분석 [1부] - 3이 메서드 내에서 메서드의 오버로드된 버전이 add()호출되고 로 표시되며 private, 이 메서드는 추가할 요소, 내부 배열 및 해당 크기 등 세 가지 매개 변수를 입력으로 사용합니다. Private 메소드에서는 검사가 수행됩니다. 전달된 크기 매개변수가 내부 배열의 길이와 같은 경우(즉, 배열이 가득 찬 경우) 배열에 메소드의 결과 grow(int minCapacity)(필드의 현재 값) 가 할당됩니다. 추가되는 요소를 고려해야 하기 때문에 size + 1이 메소드에 전달됩니다. 여기서 내부 배열에는 원래 배열의 요소를 복사하여 얻은 새로 생성된 배열에 대한 링크가 할당됩니다.
Arrays.copyOf(elementData, newCapacity(minCapacity))
메소드의 두 번째 매개변수로 copyOf메소드의 결과를 표시하며 newCapacity(int minCapacity), 그 안에서 새로운 배열 크기가 계산됩니다. 다음 공식을 사용하여 계산됩니다. int newCapacity = oldCapacity + (oldCapacity >> 1) 기본 크기의 배열의 경우 다음이 적용됩니다. >> 1– 1만큼 오른쪽으로 비트 단위 이동(숫자를 절반으로 줄이는 연산자). 본질적으로 이는 2를 1의 거듭제곱으로 나누는 것을 의미합니다. 10을 2로 나누고 10을 더하는 것으로 나타났습니다. 총계에서 배열의 새로운 용량은 15이지만 11번째 요소를 추가하므로 15 + 1이 됩니다. = 16. 목록으로 돌아가서 이미 10개의 요소를 추가했다고 가정하고 11을 추가하려고 합니다. 검사 결과 배열에 공간이 없는 것으로 표시됩니다. Arrays.copyOf이에 따라 내부적으로 system 메소드를 사용하는 새로운 배열이 생성되어 호출됩니다 System.arraycopy(). ArrayList 클래스의 상세 분석 [1부] - 4ArrayList 클래스의 상세 분석 [1부] - 5또는 JavaRush에 대한 한 기사의 명확한 예는 다음과 같습니다. ArrayList 클래스의 상세 분석 [1부] - 6이러한 모든 검사를 수행하고 필요한 경우 배열 크기를 늘린 다음 전용 메서드에서 add()새 요소가 배열 끝에 추가되고 현재 매개변수가 size1씩 증가합니다. . 이후에 이전 배열은 가비지 수집기에 의해 처리됩니다. 이것이 동적 배열이 작동하는 방식입니다. 요소를 추가할 때 아직 공간이 있는지 확인합니다. 공간이 있으면 배열 끝에 요소를 추가하기만 하면 됩니다. 끝은 배열의 마지막 셀을 의미하는 것이 아니라 값에 해당하는 셀을 의미합니다 size. 배열에 첫 번째 요소를 추가했는데, 인덱스가 [0]인 셀에 배치되었습니다. 필드 값은 size1만큼 증가하고 = 1입니다. 다음 요소를 추가합니다. 이에 size = 1따라 인덱스가 [1]인 셀에 요소를 배치합니다. 두 개의 매개변수가 있는 오버로드된 메소드 버전이 있습니다.
public void add(int index, E element)
요소를 추가하려는 셀의 위치(인덱스)를 지정할 수 있습니다. 먼저 지정된 인덱스 값의 정확성을 검사합니다. 잘못된 인덱스가 지정되어 아무것도 없는 셀을 가리키거나 단순히 존재하지 않는 셀을 가리킬 가능성이 있기 때문입니다. 인덱스 확인: index > size || index < 0– 지정된 인덱스가 현재 배열 크기보다 크거나 0보다 작은 경우 예외가 발생합니다 IndexOutOfBoundsException. 그런 다음 필요한 경우 위의 예와 유사하게 배열의 크기를 늘립니다. 배열에서 추가/제거 작업 중에 무언가가 어딘가(오른쪽이나 왼쪽)로 이동한다는 말을 들어보셨을 것입니다. 따라서 배열을 복사하여 이동이 수행됩니다. System.arraycopy(elementData, index, elementData, index + 1, s - index); 지정된 인덱스의 오른쪽에 있는 모든 요소가 한 위치 오른쪽(인덱스+1)으로 이동됩니다. 그 후에야 새 요소가 지정된 인덱스의 내부 배열에 추가됩니다. 배열의 일부를 오른쪽으로 하나씩 이동했으므로(새 배열이 생성되지 않음) 필요한 셀은 자유롭게 쓸 수 있습니다. 이전 어레이에 대한 링크는 지워지고 나중에 가비지 수집기에 의해 인계됩니다. 이미 사용 중인 셀 [3]에 "maserati"를 붙여넣습니다.
ArrayList 클래스의 상세 분석 [1부] - 7
따라서 요소가 인덱스에 삽입되고 배열에 여유 공간이 없으면 호출이 System.arraycopy()두 번 발생합니다. 첫 번째는 에서 grow(), 두 번째는 메서드 자체에서 발생 add(index, value)하며 이는 전체 추가 작업의 속도에 분명히 영향을 미칩니다. 결과적으로 내부 배열에 다른 요소를 써야 하는데 공간이 없으면 ArrayList 내부에서 다음과 같은 일이 발생합니다.
  • 원래 배열보다 1.5배 더 큰 크기와 요소 하나를 추가하여 새 배열이 생성됩니다.
  • 이전 배열의 모든 요소가 새 배열로 복사됩니다.
  • 새 배열은 ArrayList 객체의 내부 변수에 저장되고 이전 배열은 가비지로 선언됩니다.
ArrayList 유형의 객체 용량은 다음 메소드를 사용하여 수동으로 늘릴 수 있습니다.
public void ensureCapacity(int minCapacity)
어레이 용량을 미리 늘리면 나중에 RAM이 추가로 재분배되는 것을 방지할 수 있습니다. 이 메서드는 에 전달된 요소 수를 수용하기 위해 내부 배열의 크기를 늘립니다 minCapacity. 이 메서드는 ensureCapacity()필드에 영향을 주지 않고 내부 배열(크기) size에 영향을 미칩니다 . 다시 한 번 두 가지 가 서로 다른 것이므로 혼동하지 않는 것이 매우 중요하다는 점을 capacity강조합니다 ! ArrayList가 구축된 기본 배열의 크기를 실제로 저장된 현재 요소 수로 줄이려면 . 컬렉션에서 요소를 제거한 후에 는 실제로 존재하는 요소의 수가 표시되며 줄어들지 않습니다! 100개의 요소를 입력하고 처음 50개를 삭제하면 50이 되어 100으로 유지됩니다. 및 을 줄이려면 전체 용량을 현재 크기로 조정하는 메서드를 사용해야 합니다 . 잘 맞아? 빈 셀이 남지 않도록 배열을 복사합니다(새 배열의 길이는 단순히 크기 필드와 같습니다). sizecapacitytrimToSize()size()capacitysizecapacitycapacitytrimToSize()
ArrayList 클래스의 상세 분석 [1부] - 8
를 사용하여 컬렉션에 요소를 추가할 수도 있습니다 addAll.
public boolean addAll(Collection< ? extends E> c)
public boolean addAll(int index, Collection< ? extends E> collection);
첫 번째 옵션을 사용하면 메서드 매개 변수에 지정된 컬렉션(예: 다른 시트)의 모든 요소를 ​​메서드 호출이 이루어진 원래 컬렉션(끝에 삽입)에 추가할 수 있습니다. 전달된 컬렉션(세트일 수도 있음)은 toArray(). 당연히 추가 작업도 복사를 사용하여 수행됩니다. 두 번째는 collectionindex 부터 시작하여 모든 요소를 ​​목록에 추가하는 것입니다 index. 이 경우 모든 요소는 목록의 요소 수만큼 오른쪽으로 이동합니다 collection. 요소 제거 먼저 ArrayList에서 요소를 제거하는 기본 옵션을 살펴보겠습니다.
public E remove(int index)
인덱스별로 삭제를 수행하고 모든 후속(지정된 인덱스의 요소 뒤) 요소를 왼쪽으로 이동하여 "구멍"을 닫습니다. 또한 삭제 전에 추가 변수에 미리 기록된 삭제된 요소(E)를 반환하며, 이 값은 메서드 호출의 결과로 얻습니다. E가 무엇인지 이해하려면 소위 제네릭 유형에 익숙해져야 합니다. E 표기법은 메서드가 ArrayList 객체를 생성할 때 지정된 데이터 유형을 반환한다는 것을 나타냅니다(기억하세요: List <String> list따라서 이 경우 E는 "대체"됩니다 String). 일반적인 이해를 위해서는 제네릭 유형에 익숙해지는 것이 좋습니다. 입력된 인덱스의 정확성을 확인한 후 메소드 내부에서는 해당 요소가 완전히 삭제되지 않고 fastRemove(Object[] es, int i)이미 삭제가 발생한 프라이빗 메소드를 호출합니다. 배열과 지정된 인덱스를 입력으로 메서드에 전달합니다. 를 사용하여 요소를 복사하고 System.arraycopy()배열의 크기를 줄인 다음 마지막 요소에 null을 할당합니다. 새로운 배열이 생성되지 않는다는 점에 유의할 필요가 있습니다. System.arraycopy(es, i + 1, es, i, size - 1 - i); 지정된 인덱스(i+1) 아래 위치의 오른쪽에 있는 부분이 원래 배열(es)에 복사되고 바로 그 위치부터 위치합니다. (i) 삭제할 요소가 위치한 곳. 따라서 우리는 왼쪽으로 이동하여 요소를 지웠습니다.
Подробный разбор класса ArrayList [Часть 1] - 9
아래 배열에서 인덱스 3의 요소를 제거해 보겠습니다.
Подробный разбор класса ArrayList [Часть 1] - 10
두 번째 버전의 메서드를 고려해 보겠습니다.
public boolean remove(Object o)
이 메소드는 전달된 요소를 목록에서 제거 o하거나 보다 정확하게는 지정된 링크에 있는 객체를 제거합니다. 목록에 요소가 있으면 해당 요소가 제거되고 모든 요소가 왼쪽으로 이동됩니다. 요소가 목록에 존재하고 성공적으로 제거되면 메서드는 true를 반환하고, 그렇지 않으면 false를 반환합니다. 인덱스별로 삭제하는 옵션과 유사하게 메서드가 호출되며 fastRemove()여기서 정확히 동일한 작업이 발생합니다. 차이점은 Object 클래스의 remove(Object o)메소드를 통해 원하는 객체를 추가적으로 검색한다는 점이다. equals()값으로 제거할 때 루프는 일치하는 항목을 찾을 때까지 목록의 모든 요소를 ​​순회합니다. 발견된 첫 번째 요소만 삭제됩니다. 요약하자면, 동적 배열에서 요소를 삭제할 때 일반 배열처럼 구멍이 남지 않습니다(삭제된 셀은 비어 있지 않습니다). 인덱스 오른쪽에 있던 모든 후속 요소는 왼쪽으로 한 위치 이동됩니다. 목록에서 요소를 다양한 수준으로 제거하는 데 사용할 수 있는 몇 가지 추가 방법이 있습니다. 간략하게 살펴보겠습니다. 컬렉션 정리:
public void clear()
간단한 루프는 for배열의 모든 요소를 ​​반복하여 각 요소에 null을 할당합니다. 다음과 같이 이전된 다른 컬렉션에 포함된 요소를 컬렉션에서 제거할 수 있습니다.
public boolean removeAll(Collection< ?> c)
여러 요소를 제거해야 하는 경우 조건 루프에서 제거하면 안 됩니다. 메서드를 사용하는 것이 더 편리하고 안전합니다 removeAll(). 목록에서 제거될 요소 컬렉션을 허용합니다. 컬렉션에는 대상 목록이 저장하는 것과 동일한 유형의 요소가 포함되어야 합니다. 그렇지 않으면 버려질 것입니다 ClassCastException. 메서드 호출의 결과로 목록이 변경된 경우 메서드는 true를 반환합니다.
Подробный разбор класса ArrayList [Часть 1] - 11
전달된 컬렉션에 속하지 않는 요소를 제거합니다.
public boolean retainAll(Collection< ?> c)
Подробный разбор класса ArrayList [Часть 1] - 12
컬렉션이 있다고 가정해 보겠습니다.
List< String> listFirst = new ArrayList<>();
listFirst.add("White");
listFirst.add("Black");
listFirst.add("Red");
그리고 두 번째:
List< String> listSecond = new ArrayList<>();
listSecond.add("Green");
listSecond.add("Red");
listSecond.add("White");
그런 다음 listSecond.retainAll(listFirst)in 이후에는 다음이 listSecond유지됩니다.

"White"
"Red"
"Green"이 제거되었으므로 listFirst. 그러나 listSecond.removeAll(listFirst)그 이후에는 다음과 listSecond같이 유지됩니다.

"Green"
Удалorсь все элементы, которые есть в listFirst.
전달된 컬렉션에 속하지 않음 - 전달된 컬렉션에 없는 요소가 있는 경우 첫 번째 요소(메서드가 적용되는)에서 해당 요소를 제거해야 함을 의미합니다. 전송된 컬렉션에 속함 - 따라서 첫 번째 및 두 번째(전송된) 컬렉션 모두에 요소가 있는 경우 첫 번째 컬렉션의 중복 항목이 삭제됩니다.
protected void removeRange(int fromIndex, int toIndex)
지정된 시작 인덱스(포함)와 종료 지정된 인덱스(비포함) 사이에 있는 모든 요소를 ​​목록에서 제거합니다. ArrayList 개체에서 메서드를 직접 호출할 수 없다는 점은 주목할 가치가 있습니다. 사용하려면 에서 상속받아야 합니다 AbstractList/ArrayList. 이 메소드는 다른 메소드(나중에 설명할 subList)에서도 사용됩니다.
public boolean removeIf(Predicate< ? super E> filter)
지정된 조건자를 기반으로 컬렉션에서 요소를 제거합니다. 술어 자체는 주어진 조건에 해당하는 하나 이상의 요소가 제거되는 기반이 되는 특정 기능/알고리즘/조건입니다. Predicate— 기능적 인터페이스(단 하나의 메소드만 포함하므로 람다로 사용할 수 있음)는 "수신된 하나의 매개변수 - 반환된 부울" 원칙에 따라 작동합니다. 기본적으로 이 메서드는 인터페이스의 구현을 재정의 Collection하고 다음 "전략"을 구현합니다. 요소를 반복하고 일치하는 요소를 표시합니다 Predicate. 그런 다음 첫 번째 반복에서 표시된 요소를 제거(및 이동)하기 위해 두 번째로 실행됩니다. Predicate두 객체가 동일하면 true를 반환하는 인터페이스를 구현해 보겠습니다 .
class SamplePredicate< T> implements Predicate< T>{
  T varc1;
  public boolean test(T varc){
     if(varc1.equals(varc)){
       return true;
  }
  return false;
  }
}
String다른 클래스에서는 다음을 구현하는 클래스의 객체 로부터 ArrayList를 생성해 보겠습니다 Predicate.
ArrayList< String> color_list = new ArrayList<> ();
SamplePredicate< String> filter = new SamplePredicate<> ();
변수에 varc1"White" 값을 써보겠습니다.
filter.varc1 = "White";
목록에 몇 줄을 추가해 보겠습니다.
color_list.add("White");
color_list.add("Black");
color_list.add("Red");
color_list.add("White");
color_list.add("Yellow");
color_list.add("White");
removeIf조건과 함께 객체를 전달할 list 에서 메소드를 실행해 보겠습니다 .
color_list.removeIf(filter);
결과적으로 값이 "White"인 모든 행은 목록에서 제거됩니다. "술어"가 해당 행의 동등성을 비교하기 때문입니다. 최종 목록: [검은색, 빨간색, 노란색].
Подробный разбор класса ArrayList [Часть 1] - 13
요소 교체
public E set(int index, E element)
지정된 위치의 요소를 index전달된 요소로 바꿉니다 element. 또한 인덱스는 0보다 크고 마지막 요소의 인덱스보다 작아야 합니다. 그렇지 않으면 예외가 발생합니다 IndexOutOfBoundsException. 내부 배열의 복사본이 발생하지 않습니다. 간단히 말해서 지정된 인덱스의 요소 대신 새 요소가 삽입됩니다. 값을 덮어씁니다.
Подробный разбор класса ArrayList [Часть 1] - 14
public void replaceAll(UnaryOperator<e> operator)
컬렉션의 모든 요소를 ​​변경합니다(조건에 따라 가능). 대부분 인터페이스를 구현하고 해당 메서드를 정의하는 람다 또는 익명 클래스 (그러나 명확성을 위해 이 예에서는 단순히 인터페이스를 구현하는 클래스를 사용함)와 함께 사용됩니다 UnaryOperator. 인터페이스를 구현해 보겠습니다.
class MyOperator< T> implements UnaryOperator< T>{
   T varc1;
   public T apply(T varc){
     return varc1;
  }
}
String다른 클래스에서는 다음을 구현하는 클래스의 객체 로부터 ArrayList를 생성해 보겠습니다 UnaryOperator.
ArrayList< String> color_list = new ArrayList<> ();
MyOperator< String> operator = new MyOperator<> ();
변수에 varc1"White" 값을 써보겠습니다.
operator.varc1 = "White";
목록에 몇 줄을 추가해 보겠습니다.
color_list.add("White");
color_list.add("Black");
color_list.add("Red");
color_list.add("White");
color_list.add("Yellow");
color_list.add("White");
replaceAll객체를 전달할 목록에서 메소드를 실행해 보겠습니다 operator.
color_list.replaceAll(operator);
결과적으로 목록의 모든 값은 "흰색"으로 대체되었습니다: [흰색, 흰색, 흰색, 흰색, 흰색, 흰색]. 예를 들어 다음과 같은 방법으로 컬렉션에 있는 문자열에서 모든 공백을 제거할 수 있습니다.
ArrayList< String> list = new ArrayList<>(Arrays.asList("A   ", "  B  ", "C"));
list.replaceAll(String::trim);
기타 방법: 다음 방법을 사용하여 ArrayList 목록 배열을 일반 배열로 변환할 수 있습니다.
public Object[] toArray()
또는
public < T> T[] toArray(T[] a)
- 여기서 반환된 배열의 유형은 다음에서 결정됩니다. runtime 이 방법을 사용하면 다음이 허용됩니다.
  1. 일부 작업 속도를 높이십시오.
  2. 컬렉션을 직접 허용하려면 오버로드되지 않은 메서드에 배열을 매개 변수로 전달합니다.
  3. 컬렉션을 인식하지 못하는 레거시 코드와 새로운 컬렉션 기반 코드를 통합합니다.
배열의 복사 객체를 반환합니다:
public Object clone()
이 메소드는 clone()Object 유형을 반환하므로 이를 호출한 후에는 필요한 클래스로 캐스팅해야 합니다. 복제는 새로운 독립 객체를 생성합니다. 컬렉션에 객체가 있는지 확인하세요.
public boolean contains(Object o)
목록에 객체가 있는지 확인하고(내부적으로 Object 클래스의 equals 메소드 사용, 즉 참조 비교) 결과에 따라 true/false를 반환합니다. 일반적인 루프 외에도 다음을 사용하여 컬렉션을 반복(각 요소에 액세스하고 일부 작업 수행)할 수 있습니다.
public void forEach(Consumer< ? super E> action)
목록을 표시하는 방법은 다음과 같습니다.
List< Integer> numbers = new ArrayList<>(Arrays.asList(10, 20, 50, 100, -5));
numbers.forEach((number)-> System.out.println(number));
람다를 사용하지 않고 익명 클래스를 사용하고 accept인터페이스 메서드를 재정의해야 합니다 Consumer.
numbers.forEach(new Consumer< Integer>() {
  @Override
   public void accept(Integer integer) {
      System.out.println(integer);
          }
});
인덱스로 요소를 가져옵니다.
public E get(int index)
컬렉션 요소에 대한 무작위 액세스에 사용됩니다. 목록의 지정된 인덱스에 있는 요소를 반환합니다. index < 0또는 가 index >=목록의 최대 요소 수인 경우 예외가 발생합니다 IndexOutOfBoundsException. 이는 리스트에서 요소를 검색하는 기본적인 방법으로, 특정 배열 셀에 접근하기 때문에 ArrayList의 크기에 관계없이 인덱스별로 요소를 검색하는 시간은 항상 동일합니다. 지정된 객체에 대한 인덱스 찾기:
public int indexOf(Object o);
public int lastIndexOf(Object o);
메소드는 목록에서 첫 번째(주어진 객체가 처음 발견될 때) 또는 마지막 발생(주어진 객체가 마지막으로 발견될 때) 요소의 인덱스를 반환합니다. 해당 요소가 목록에 없으면 메서드는 -1을 반환합니다.
Подробный разбор класса ArrayList [Часть 1] - 16
Подробный разбор класса ArrayList [Часть 1] - 17
요소 컬렉션을 확인하세요.
public boolean isEmpty();
이 메서드는 목록이 비어 있으면(필드가 동일한지 확인 size 0) true를 반환하고, 그렇지 않으면 false를 반환합니다. 목록에 null 요소만 포함되어 있으면 메서드는 false를 반환합니다. 즉, 이 방법에서는 null 요소도 고려됩니다. 목록의 요소 수를 알아보세요.
public int size();
목록의 요소 수(크기 필드 값)를 반환합니다. 요소수는 목록 용량(capacity)과 다를 수 있습니다. 목록에 대한 반복자를 가져옵니다.
public Iterator< E> iterator();
루프나 다른 처리에서 나중에 사용하기 위해 목록에 대한 반복자를 반환합니다. 반복자는 빠른 실패 동작을 구현합니다. 컬렉션을 실행하면서 일부 수정 사항(반복기 메서드를 사용하여 얻은 것이 아님)을 발견하면 즉시 예외가 발생합니다 ConcurrentModificationException. 반복자에는 이라는 것이 있습니다 modification count. 반복자는 각 컬렉션 이후에 컬렉션을 반복할 때 next/hasNext/remove이 카운터를 확인합니다. 반복자가 예상한 것과 일치하지 않으면 예외가 발생합니다. 여기서는 반복자를 자세히 고려하지 않겠습니다.
public ListIterator< E> listIterator() и public ListIterator< E> listIterator(int index)
나중에 루프나 다른 처리에서 사용하기 위해 목록에 대한 목록 반복자를 반환합니다. 인터페이스는 목록의 양방향 탐색과 해당 요소 수정을 위해 ListIterator인터페이스를 확장합니다 . Iterator오버로드된 버전에서는 "순회"가 시작되는 인덱스를 전달할 수 있습니다. 이 경우 인덱스는 메서드가 작업을 시작할 첫 번째 요소를 나타내며 next(), 메서드가 호출되면 previous()"passed index - 1" 인덱스 아래의 요소부터 순회가 시작됩니다.
public Spliterator <E> spliterator()
Java 8에는 구분 기호 반복자라고 하는 새로운 유형의 후기 바인딩 및 빠른 실패 반복자가 도입되었습니다. 구분 기호 반복자를 사용하면 일련의 요소를 반복할 수 있지만 다른 방식으로 사용됩니다. Spliterator 인터페이스 의 가장 중요한 기능은 요소 시퀀스의 개별 부분에 대한 병렬 반복을 지원하여 병렬 프로그래밍을 지원하는 기능입니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION