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