在处理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并且set(5,...)应该有效。
ACTUAL:抛出异常IndexOutOfBoundsException
。
是设置方法导致问题吗?
答案 0 :(得分:20)
test.set(5, "test");
是抛出此异常的语句,因为您的ArrayList
为空(如果您已完成该语句,size()
将返回0
),并且您可以'如果第i个元素尚未包含值,则设置它。您必须向ArrayList
添加至少6个元素才能使test.set(5, "test");
生效。
new ArrayList(10)
不会创建大小为10的ArrayList
。它会创建一个空的ArrayList
,其初始容量为10.
答案 1 :(得分:8)
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));
作为旁注,you should never use raw types与List
类似,但总是更喜欢参数化列表。
答案 2 :(得分:3)
List test = new ArrayList(10);
创建一个空列表,其容量为10个元素。它不包含第6个位置的元素,因此您将无法在此位置设置元素。
答案 3 :(得分:2)
List test = new ArrayList(10);
创建具有初始容量的空 ArrayList
原始类型(Object
)(最初列表容量,初始化内部数组,长度为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
}
您可以相应地增加或减少它,假设您确定需要带有20
元素的列表,最好在开始时设置初始容量。如果您确定列表中肯定有的最小元素数,它可以避免调整数组。
test.set(5, "test");
方法 替换 元素在此处的特定位置,它将用5
替换索引test
处的元素。但是我们的列表是空的,它没有任何元素。
此方法的文档说明,
IndexOutOfBoundsException
- 如果index
超出范围(index < 0
||index >= size()
)
请注意,列表大小为0
,因此索引(5
)大于大小(0
)。
答案 4 :(得分:0)
使用指定的元素替换此列表中指定位置的元素。
set
参数
索引 int:要替换的元素的索引
元素 E:要存储在指定位置的元素
返回 Ë 先前在指定位置的元素
抛出
IndexOutOfBoundsException