이 코드가 indexofoutBoundSexection을 던지는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1644741

  •  10-07-2019
  •  | 
  •  

문제

다음 두 개의 코드 스 니펫을 고려하십시오.

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- 그러나 그렇지 않습니다.

  1. 왜 안 돼?

  2. 그렇게해야합니다 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이 최대 수가 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top