繁体   English   中英

ArrayList 索引越界

[英]ArrayList index out of bounds

如果已经预定义了 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);

在设置另一个项目之前,您不能将项目放入 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);

edit/Replaced add by set 替换空对象

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

当您向列表中添加元素时,容量将根据需要增长。 在构造函数中指定初始容量的唯一原因是如果您知道要添加大量元素,则预先分配更大的容量。 这意味着底层数组在添加它们时不必经常调整大小。

无论您在ArrayList构造函数中指定什么值,列表的大小完全取决于您放入其中的内容,因此在添加至少 2 个元素之前,您无法获取index为 1 的项目。

在将add()ArrayList ,列表的长度为 0。您不能添加超过List的当前末尾。

我建议这样做:

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

在这里获得您似乎想要的订单。

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

您指定的是初始容量,这只是内部数组的初始大小,如果需要,它会自动增加。 它与 item position 无关,因此您的错误。 顺便说一下,ArrayLists 的默认容量是 10,所以你实际上使它小于默认值。

根据javadoc ,当你写

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

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

您可以自己尝试:在每行之后打印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

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

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));

为了得到你想要的结果,你必须写

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM