ArrayList索引超出范围

时间:2012-01-04 15:56:31

标签: java arraylist

如果已预定义ArrayList的大小,为什么在此示例中引发java.lang.IndexOutOfBoundsException?如何解决这个问题呢?

int size = 2:
ArrayList<Integer[]> nums = new ArrayList<Integer[]>(size);
Integer[] value1 = {1,2,3};
Integer[] value2 = {1,2};
nums.add(1,value1); // java.lang.IndexOutOfBoundsException
nums.add(0,value2);

7 个答案:

答案 0 :(得分:15)

在设置另一个项目之前,不能将项目放在ArrayList中。如果你想这样做,你必须首先为地点0上的项目分配空值。

如果您这样做,它将起作用:

int size = 2:
ArrayList<Integer[]> nums = new ArrayList<Integer[]>(size);
Integer[] value1 = {1,2,3};
Integer[] value2 = {1,2};
nums.add(0, null);
nums.add(1,value1);
nums.set(0,value2);

编辑/替换按set添加以替换空对象

答案 1 :(得分:9)

ArrayList构造函数的参数不是列表的大小,正如您的代码所假设的那样;它是数据结构使用的底层存储的容量

当您向列表中添加元素时,容量将根据需要增长。在构造函数中指定初始容量的唯一原因是,如果您知道要添加大量元素,则预先分配更大的容量。这意味着在添加基础数组时,基础数组不会过于频繁地调整大小。

无论您在ArrayList构造函数中指定了什么值,列表的 size 都只受您放入的内容的约束,因此您无法使用{获取该项目{1}}为1,直到您添加了至少2个元素。

答案 2 :(得分:3)

当您add()ArrayList时,列表的长度为0.您无法添加List的当前结尾。

我建议你这样做:

nums.add(value2);
nums.add(value1); 

要获得您在此处想要的订单。

答案 3 :(得分:3)

http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList(int

您指定的是初始容量,这只是内部阵列的初始大小,如果需要,会自动增加。 它与项目位置无关,因此您的错误。顺便说一句,ArrayLists的默认容量是10,所以实际上它比默认容量小。

答案 4 :(得分:1)

根据javadoc,当你写

ArrayList<Integer[]> nums = new ArrayList<Integer[]>(size);

您没有定义 nums 大小,您正在定义初始容量 - 从这个意义上说,ArrayLists不是像内置数组(代码中的 value1 value2 )。

您可以自己尝试:在每行之后打印 nums 的大小(清除代码以防止IndexOutOfBoundsException。

int size = 2:
ArrayList<Integer[]> nums = new ArrayList<Integer[]>(size);
Integer[] value1 = {1,2,3};
Integer[] value2 = {1,2};
System.out.println(nums.size());
nums.add(value2);
System.out.println(nums.size());
nums.add(value1);
System.out.println(nums.size());

这将打印:

0
1
2

答案 5 :(得分:0)

要获得您想要的结果,您必须写

nums.add(0, value1);
nums.add(0, value2);

答案 6 :(得分:0)

为了获得您期望的结果,我建议使用基本类型数组,如

Integer[][] nums = new Integer[size][];

然后

Integer[] value1 = {1,2,3};
Integer[] value2 = {1,2};
nums[1] = value1; 
nums[0] = value2;

如果您仍需要ArrayList,请使用

new ArrayList<Integer[]>(Arrays.asList(nums));