1. ArrayList구성 방법

ArrayList요소를 저장하는 데 가장 일반적으로 사용되는 Java 클래스입니다. 그렇다면 어떻게 ArrayList작동하며 왜 모두가 좋아할까요?

의 구조는 ArrayList간단하고 독창적입니다. 각 ArrayList개체에는 두 개의 필드가 있습니다.

  • 요소 배열
  • size목록의 요소 수를 저장하는 변수

내부적으로 ArrayList객체는 가장 일반적인 배열을 포함합니다! 하지만 그게 다가 아닙니다. 목록의 길이를 저장하는 크기 변수 도 있습니다 . 작동 방식은 다음과 같습니다.

처음에 목록 내부의 배열 길이는 10입니다. 그리고 size변수는 0입니다.

목록에 요소를 추가하면 배열의 0번째 셀에 저장되고 size1로 증가합니다.

요소를 하나 더 추가하면 첫 번째 셀에 저장되고 size다시 1씩 증가하여 2가 됩니다.

배열에 더 이상 공간이 없을 때 다른 요소를 추가하면 메서드에서 다음이 발생합니다 add().

  1. 이전 어레이 길이의 1.5배인 새 어레이가 생성됩니다.
  2. 이전 배열의 모든 요소가 새 배열로 복사됩니다.
  3. ArrayList개체 에서 새 배열에 대한 참조가 이전 배열에 대한 참조를 대체합니다 .
  4. 전달된 요소는 새 배열의 10번째 셀에 저장됩니다 .
  5. 크기 변수가 1씩 증가하여 이제 11이 됩니다 .

목록 중간에 요소를 추가(삽입)할 때도 비슷한 일이 발생합니다. 기존 요소는 오른쪽으로 1만큼 이동하고 전달된 요소는 배열의 새로 해제된 셀에 기록됩니다.

이제 목록과 관련된 가장 기본적인 시나리오를 살펴보겠습니다.


2. 요소 추가ArrayList

목록에 요소가 추가될 때 목록 내부에서 어떤 일이 발생하는지 살펴보겠습니다. ArrayList 객체가 생성된 직후 메모리에는 다음과 같은 것이 있습니다.

ArrayList에 요소 추가

ArrayList두 개의 필드(두 개의 변수), 즉 컨테이너( data배열)와 저장된 요소의 수( )를 포함하는 객체가 있습니다 size. 변수 는 data10개의 요소를 저장할 수 있는 컨테이너(배열)에 대한 참조를 저장합니다.

배열에 숫자 5를 추가하기로 결정하면 다음 그림이 표시됩니다.

ArrayList 2에 요소 추가

배열은 이제 요소 5를 저장하고 size == 1.

누군가 지금 객체 size()에 대한 메서드를 호출하면 ArrayList반환 값은 목록에 저장된 요소의 수입니다. 1. 목록의 요소 수는 배열의 저장 용량과 동일하지 않습니다.

현재 스토리지 용량이나 어레이 자체는 개체 외부에서 액세스(볼 수)되지 않습니다 ArrayList. 이것은 항상 의 내부 데이터입니다 ArrayList.

10, 20, 30, 40, 50, 60, 70 등 7개의 숫자를 목록에 추가해 보겠습니다.

이제 메모리는 다음과 같이 표시됩니다.

ArrayList에 요소 추가

지금 메서드 를 호출하면 size()목록의 새 요소 수인 숫자 8이 반환됩니다. 이 값은 내부 배열의 크기와 관련이 없습니다.

중요한:

이 그림에는 한 가지 지나친 단순화가 있습니다.

클래스 는 기본 유형 ArrayList을 저장할 수 없으므로 . 컨테이너는 {5, 10, 20, 30, 40, 50, 60, 70} 값을 직접 저장하지 않고 개체에 대한 참조를 저장합니다. 컨테이너 저장소의 모든 빈 셀 .IntegerintIntegernull



3. 목록 길이 늘리기

내부 배열에 빈 셀이 더 이상 없을 때 목록 내부에서 어떤 일이 발생하는지 살펴보겠습니다.

10개의 요소 목록이 있다고 가정합니다.

목록 길이 늘리기

숫자 100 을 추가하기로 결정했습니다 . 이것은 add()메서드에서 일어나는 일입니다.

1단계 - 새 어레이 생성:

목록 길이 늘리기 2

2단계 — 기존 배열의 모든 요소를 ​​새 배열로 복사합니다.

목록 길이 늘리기 2

3단계 - 이전 배열을 교체합니다(객체의 내부 배열에 대한 참조 변경 ArrayList).

리스트 길이 늘리기 3

4단계 — 우리가 열심히 노력하여 달성한 새 번호를 추가합니다.

목록 길이 늘리기 4