数组的 Set 方法列表抛出 IndexOutOfBoundsException

2022-09-03 17:11:28

在工作时,我发现使用构造函数设置数组的初始大小后,使用会抛出异常,尽管数组已创建,但大小设置不正确。ArrayListinitialCapacityset()

使用 也不起作用,因为它基于数组而不是 。ensureCapacity()elementDatasize

还有其他副作用,因为静电与。DEFAULT_CAPACITYensureCapacity()

完成这项工作的唯一方法是在使用构造函数后根据需要使用add()的时间。

请检查下面的代码。

import java.util.ArrayList;
import java.util.List;

public class Test {

public static void main(String[] args) {

    List test = new ArrayList(10);
    test.set(5, "test");
    System.out.println(test.size());
}

我不确定为什么java会抛出这个异常。

我期望的行为:应该返回10和set(5,...)应该工作。test.size()

实际:引发异常 。IndexOutOfBoundsException

那么,是设置方法导致了问题吗?


答案 1

test.set(5, "test");是引发此异常的语句,因为您的是空的(如果您到达该语句,将返回),并且如果它尚未包含值,则无法设置 i'th 元素。您必须向 中添加至少 6 个元素才能有效。ArrayListsize()0ArrayListtest.set(5, "test");

new ArrayList(10)不会创建大小为 10 的 。它将创建一个初始容量为 10 的空。ArrayListArrayList


答案 2

异常不是由 引发的,而是由 引发的。这是因为您正在将元素设置为索引 5,但该列表当前为空。test.size()test.set(5, "test");

List test = new ArrayList(10);

不创建使用 10 个元素初始化的列表。它创建一个初始容量为 10 个元素的列表,即支持数组的大小为 10,但列表本身仍然是空的。null

如果要初始化包含 10 个元素的列表,可以使用null

List<String> list = new ArrayList<>(Collections.nCopies(10, null));

作为旁注,您永远不应该使用原始类型,而应始终更喜欢参数化列表。List