이 코드가 indexofoutBoundSexection을 던지는 이유는 무엇입니까?
문제
다음 두 개의 코드 스 니펫을 고려하십시오.
int index = 676;
List<String> strings = new ArrayList<String>();
strings.add(index, "foo");
그리고
int index = 676;
List<String> strings = new ArrayList<String>();
strings.ensureCapacity(index);
strings.add(index, "foo");
첫 번째 경우, 나는 indexofoutboundsexception을 보는 것에 놀라지 않습니다. API에 따르면, add(int index, E element)
인덱스가 범위를 벗어난 경우 indexofoutboundsexection을 던질 것입니다. (index < 0 || index > size())
". 의 크기 strings
요소가 추가되기 전에 0이므로 인덱스는 ArrayList의 크기보다 확실히 클 것입니다.
그러나 두 번째 경우에 나는 ensureCapacity
성장합니다 strings
전화로 add
문자열을 올바르게 삽입합니다 "foo"
인덱스 676- 그러나 그렇지 않습니다.
왜 안 돼?
그렇게해야합니다
add(index, "foo")
작동합니다index > strings.size()
?
해결책
배열 목록에서 기본 배열의 용량은 상위 레벨 목록 API 메소드 (추가, 제거 등)와 구별되며 백업 배열의 크기 만 말합니다. 목록 범위를 넘어서 요소를 추가하려면 유틸리티 클래스, 널, 빈 개체 또는 새로 응용 프로그램이 새로 기대할 수있는 모든 것을 코딩해야합니다. 색인과 이전 크기.
다른 팁
ArrayList.enseRecApacity ()는 목록의 실제 크기를 변경하지 않고 (size ()에 의해 반환 됨)가 아니라 내부 버퍼를 재 할당 하여이 크기로 성장할 수 있도록 버퍼를 재 할당 할 필요가 없도록 내부 버퍼를 재 할당합니다 (목록을 호출 할 때. .add (객체).
/**
* Increases the capacity of this <tt>ArrayList</tt> instance, if
* necessary, to ensure that it can hold at least the number of elements
* specified by the minimum capacity argument.
*/
거친 추측을 받아들이고, 당신이 찾고있는 것이
Integer index = Integer.valueOf(676);
Map<Integer,String> strings = new HashMap<Integer,String>();
strings.put(index, "foo");
길이는 676이지만 0 기반이라는 것을 기억해야하므로 실제로 인덱스 -1이 최대 수가 될 것입니다.