在处理时ArrayList
,我发现在使用构造函数设置了数组的初始大小之后initialCapacity
,set()
尽管创建了数组,但是使用将抛出异常,但是未正确设置大小.
使用ensureCapacity()
将无法工作,因为它基于elementData
数组而不是size
.
还有其他副作用静态的,因为DEFAULT_CAPACITY
用ensureCapacity()
.
使这项工作的唯一方法是在使用构造函数后使用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会抛出这个异常.
我期望的行为:test.size()
应该返回10并且设置(5,...)应该工作.
实际:抛出异常IndexOutOfBoundsException
.
那么导致问题的set方法是什么?
test.set(5, "test");
抛出此异常的语句,因为您ArrayList
的空是空的(如果你有这个语句size()
就会返回0
),如果它没有包含值,你就不能设置第i个元素.您必须添加至少6个元素,你ArrayList
为了test.set(5, "test");
有效.
new ArrayList(10)
不会创建ArrayList
其大小为10.它创建一个空,ArrayList
其初始容量为10.
该异常没有被抛出test.size()
,但通过test.set(5, "test");
.这是因为您在索引5处设置元素,但列表当前为空.
List test = new ArrayList(10);
不会创建使用10个null
元素初始化的列表.它创建一个初始容量为10个元素的列表,即支持数组的大小为10,但列表本身仍为空.
如果要初始化包含10个null
元素的列表,可以使用
Listlist = new ArrayList<>(Collections.nCopies(10, null));
作为旁注,您不应该使用类似的原始类型,List
但总是更喜欢参数化列表.