Java ArrayList <Double> IndexOutOfBoundsException问题

Seb*_*tel 5 java collections

我有一个问题ArrayList.我需要它来存储结果.因为我要开始与元素n我试着给了ArrayList一个容量ensureCapacity(n+1)使用set(n,x),但我得到的IndexOutOfBoundsException.

我尝试add(x)在使用set之前存储n ,这有效.

所以我想知道为什么它在我的路上不起作用以及如何解决这个问题,因为放n次add(x)并不是一个好的风格;-)

Mar*_*ers 7

当您更改ArrayList的容量时,它不会创建任何元素,它只会保留可能存在元素的内存.您可以在调整容量之前和之后检查尺寸,您会发现它没有变化.

更改容量的目的是,如果您事先知道您将拥有多少元素,那么您可以在添加新元素时避免不必要的重复调整大小,并且可以避免因未使用的容量过多而浪费内存.


Kev*_*ock 6

如果您不喜欢直接使用自己的循环和列表add方法,那么还有另一种方法.直接创建您ArrayList想要的元素数量,如下所示:

final int MAX_ELEMENTS = 1000;
List<Integer> myList = new ArrayList<Integer>(
    Collections.<Integer>nCopies(MAX_ELEMENTS, null));
Run Code Online (Sandbox Code Playgroud)

或者,如果您已经有一个列表要按n元素扩展大小:

myList.addAll(Collections.<Integer>nCopies(n, null));
Run Code Online (Sandbox Code Playgroud)

(注意,我在这里假设列表将保存Integer对象,但您可以将其更改为您的自定义类型.如果您正在使用raw/pre-Java 5类型,那么只需删除泛型声明.)

至于你的实际问题:容量!=内容.ArrayList内部同时具有物理数组和实际数据.增加容量,更改内部数组,以便它可以容纳那么多元素,但是,计数不会改变.您需要添加元素以增加该计数.

另一方面,如果您只是尝试设置特定元素并知道要使用的最大值,为什么不直接使用数组?如果您需要将此数组传递给采用Lists 的API,请使用Arrays.asList.其他类仍然可以更改后备阵列的内容,但它无法增加它的大小或容量.