Java ArrayList抛出IndexOutOfBoundsException的集合方法
在处理Java ArrayList抛出IndexOutOfBoundsException的集合方法,java,arrays,arraylist,Java,Arrays,Arraylist,在处理ArrayList时,我发现在使用带有initialCapacity的构造函数设置数组的初始大小后,使用set()将引发异常,尽管创建了数组,但大小设置不正确 使用ensureCapacity()也不起作用,因为它基于elementData数组,而不是size 由于使用ensureCapacity()的静态默认容量还有其他副作用 唯一可行的方法是在使用构造函数后尽可能多地使用add() 请检查下面的代码 import java.util.ArrayList; import java.uti
ArrayList
时,我发现在使用带有initialCapacity
的构造函数设置数组的初始大小后,使用set()
将引发异常,尽管创建了数组,但大小设置不正确
使用ensureCapacity()
也不起作用,因为它基于elementData
数组,而不是size
由于使用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,而set(5,…)应该可以工作
实际:引发异常IndexOutOfBoundsException
那么是set方法导致了问题吗?test.set(5,“test”)是引发此异常的语句,因为ArrayList
为空(size()
将返回0
,如果该语句不包含值,则无法设置第i个元素。您必须向ArrayList
中添加至少6个元素,以便test.set(5,“test”)代码>必须是有效的
newarraylist(10)
不会创建大小为10的ArrayList
。它创建一个空的ArrayList
,其初始容量为10。异常不是由test.size()
引发的,而是由test.set(5,“test”)引发的代码>。这是因为您正在索引5处设置一个元素,但列表当前为空
List test = new ArrayList(10);
不创建用10个null
元素初始化的列表。它创建了一个初始容量为10个元素的列表,即支持数组的大小为10,但列表本身仍然为空
如果要使用10个null
元素初始化列表,可以使用
List<String> list = new ArrayList<>(Collections.nCopies(10, null));
List List=newarraylist(Collections.nCopies(10,null));
作为旁注,类似于列表
,但始终更喜欢参数化列表。列表测试=新的ArrayList(10)代码>创建空列表,该列表的容量为10个元素。它在第6个位置不包含元素,因此您将无法在此位置设置元素。列表测试=新的ArrayList(10)代码>创建原始类型(对象
)的空数组列表
,初始容量(列表容量,初始化长度为10的内部数组)不与大小(列表包含的元素数)混淆
要了解更多信息,请首先注意,ArrayList
只不过是对数组的操作,以动态更改数组的大小,而我们无法直接使用数组。最终,它是一个智能阵列
通过设置初始容量,我们告诉ArrayList
最初创建数组的大小10
(默认初始容量为10
)
这就是构造器所做的
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];//creates initial array
}
public数组列表(int initialCapacity){
超级();
如果(初始容量<0)
抛出新的IllegalArgumentException(“非法容量:”+
初始容量);
this.elementData=新对象[initialCapacity];//创建初始数组
}
您可以相应地增加或减少它,比如说您确定需要包含20个元素的列表。最好在开始时设置初始容量。若您确定列表中肯定包含的元素的最小数量,那个么就可以避免调整数组的大小
test.set(5,“test”)代码>方法替换特定位置处的元素,这里它将用测试替换索引5
处的元素。但是我们的列表是空的,它没有任何元素
这种方法的文件说明
IndexOutOfBoundsException
-如果索引超出范围(索引<0
|
索引>=size()
)
请注意,列表的大小为0
,因此索引(5
)大于大小(0
)。将此列表中指定位置的元素替换为指定元素
set
参数
索引
int:要替换的元素的索引
元素
E:存储在指定位置的元件
返回
E
先前位于指定位置的元素
投掷
IndexOutOfBoundsException
我更新了我的问题,之前没有正确解释,请检查now@ShowStopper有什么没有解释清楚?ArrayList初始化为0长度,而不管其初始容量如何,除非您使用的构造函数使用另一个集合的元素初始化ArrayList。此处没有“ArrayList.size()的特殊行为”。你还没到那里。好吧,我会把标题改成可能的副本,我不相信那里提供的答案,我认为ERAN提供的答案更简单,更容易解释。因此,这不是一个重复的问题,这是一个更清晰的问题和答案的重复