ArrayList#get
,set
和remove
首先调用rangeCheck
方法。此方法不检查索引是否为负数。它仅检查索引是否大于或等于数组的长度。 Javadoc解释了原因;如果索引为负数,则数组访问将引发ArrayIndexOutOfBoundsException
。
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
根据Java Langauage Specification,如果index不仅是负数而且是gte,则数组访问会抛出ArrayIndexOutOfBoundsException。
在运行时检查所有数组访问;尝试使用索引 小于零或大于或等于的长度 数组导致抛出ArrayIndexOutOfBoundsException。
我认为rangeCheck应该检查negative和gte,或者为了性能,不应该检查。 为什么没有rangeCheck检查索引是否为负数?
答案 0 :(得分:11)
非常简单,因为在ArrayList
中,后备阵列可能大于当前大小。
在当前实施中,每当超过当前最大容量时,ArrayList
的后备阵列容量增加1.5倍。默认初始容量为10,当您尝试将第11个元素添加到列表中时,阵列将以15的容量重新分配。当您超过15时,它将转到22,等等。
在任何给定时间,容量可能都大于ArrayList
中当前的元素数。
检查负索引是留给JVM(在后备阵列上),而ArrayList
本身只需要检查当前列表的上端。