ArrayList의 초기 크기 한 공간에 액세스 할 수없는

다음을 수행하여 ArrayList의 초기 크기를 설정할 수 있습니다

ArrayList<Integer> arr=new ArrayList<Integer>(10);

그러나 할 수 없습니다

arr.add(5, 10);

범위를 벗어난 예외가 발생하기 때문입니다.

할당 한 공간에 액세스 할 수없는 경우 초기 크기 설정은 무엇입니까?

추가 기능은 add(int index, Object element)색인 10에 추가하지 않도록 정의됩니다 .



답변

배열 목록의 크기와 용량을 혼동하고 있습니다.

  • 사이즈 리스트의 요소의 수이고;
  • 용량 리스트는 잠재적으로 그 내부 구조를 재 할당없이 수용 할 수있는 요소 수이다.

를 호출 new ArrayList<Integer>(10)하면 목록의 크기가 아니라 목록의 초기 용량을 설정하게됩니다 . 다시 말해서, 이런 식으로 구성되면, 배열리스트는 수명이 다 된 상태로 시작됩니다.

배열 목록에 10 개의 요소를 추가하는 한 가지 방법은 루프를 사용하는 것입니다.

for (int i = 0; i < 10; i++) {
  arr.add(0);
}

이 작업을 수행하면 인덱스 0..9에서 요소를 수정할 수 있습니다.


답변

미리 정의 된 크기의 목록을 원하는 경우 다음을 사용할 수도 있습니다.

List<Integer> arr = Arrays.asList(new Integer[10]);


답변

Collections.fill (list, obj);를 사용하려면 반복되는 객체로 목록을 채우려면 대신 사용할 수 있습니다.

ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));

라인은 ArrayList에 10 번 0을 복사합니다.


답변

의 용량sizeArrayList다릅니다 . 크기ArrayList(및 다른 요소에 포함 된 요소 수와 같습니다.List 구현)에 .

용량 internaly의 요소를 저장하는데 사용되는 기본 어레이의 단 길이 ArrayList, 항상 크거나 동일 사이즈 목록.

set(index, element)목록을 호출 할 때 index목록 요소의 실제 수 (= 크기)와 관련이 있습니다 (코드에서 0이므로AIOOBE 배열 길이 (= 용량) throw 됨)와 관련이 있습니다 (구현 세부 사항에 따라 다릅니다) ~로ArrayList ).

set방법은와 List같은 모든 구현에 공통적입니다 . 예를 들어 LinkedList실제로 배열에 의해 구현되지 않고 연결된 항목 체인으로 사용됩니다.

편집 : 실제로이 add(index, element)방법을 사용 set(index, element)하지는 않지만 원칙은 동일합니다.


답변

index가있는 요소를 추가하려는 경우 대신 배열을 사용할 수 있습니다.

    String [] test = new String[length];
    test[0] = "add";


답변

10은 크기 (0)가 아니라 AL의 초기 용량입니다. 요소를 많이 추가 할 때는 초기 용량을 높은 값으로 언급해야합니다. 요소를 계속 추가 할 때 용량을 확장하는 오버 헤드가 발생하지 않기 때문입니다.


답변

귀하의 질문에 대한 정확한 답변은 다음과 같습니다.

ArrayList에서 초기 크기를 설정하면 nr이 줄어 듭니다. 내부 메모리 재 할당이 자주 발생합니다. 리스트는 배열에 의해 지원됩니다. 예를 들어, 요소를 처음 삽입 할 때 초기 용량 0을 지정하면 내부 배열의 크기를 조정해야합니다. 목록에 보유 할 요소의 수를 대략적으로 알고 있다면 초기 용량을 설정하면 nr이 줄어 듭니다. 목록을 사용하는 동안 발생하는 메모리 재 할당 수