为什么ArrayList#rangeCheck不检查索引是否为负数?

时间:2016-08-15 06:22:33

标签: java arraylist

ArrayList#getsetremove首先调用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检查索引是否为负数?

1 个答案:

答案 0 :(得分:11)

非常简单,因为在ArrayList中,后备阵列可能大于当前大小。

在当前实施中,每当超过当前最大容量时,ArrayList的后备阵列容量增加1.5倍。默认初始容量为10,当您尝试将第11个元素添加到列表中时,阵列将以15的容量重新分配。当您超过15时,它将转到22,等等。

在任何给定时间,容量可能都大于ArrayList中当前的元素数。

检查负索引是留给JVM(在后备阵列上),而ArrayList本身只需要检查当前列表的上端。