-2
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());
}

我需要创建一个列表,然后添加最后一个元素,然后添加从开始到第一次添加的最后一个元素的所有元素。不,我不能在最后添加它。这是正确的方法吗?

4

1 回答 1

1

不,它肯定行不通。构造函数

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);
于 2013-10-01T14:05:22.723 回答