final int k = 9;
final List<A> as = new ArrayList<A>(k + 1);
as.set(k, new A());
for (int i = 0; i < k; i++) {
as.add(new A());
}
我需要创建一个列表,然后添加最后一个元素,然后添加从开始到第一次添加的最后一个元素的所有元素。不,我不能在最后添加它。这是正确的方法吗?
不,它肯定行不通。构造函数
new ArrayList<A>(k + 1)
只告诉结果列表的容量为k + 1
. 新列表的大小仍然为 0。因此下一条语句
as.set(k, new A());
将立即抛出 IndexOutOfBoundsException。
如果我是你,我会简单地保存该值并在最后添加它,假设new A()
调用有一个副作用,它会迫使你首先填写最后一个元素(这本身就是一个坏主意):
final A lastA = new A();
for (int i = 0; i < k; i++) {
as.add(new A());
}
as.add(lastA);
或者,创建一个具有该固定大小的数组,并将其转换为列表(请注意,结果不是 ArrayList 并且无法调整大小):
final A[] aa = new A[k + 1];
aa[k] = new A();
for (int i = 0; i < k; ++ i) {
aa[i] = new A();
final List<A> as = Arrays.asList(aa);