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语言规范的说法,如果索引不仅为负值,而且是ArrayIndexOutOfBoundsException,则数组访问将抛出一个gte。
在运行时检查所有数组访问;尝试使用小于零或大于或等于数组长度的索引将引发ArrayIndexOutOfBoundsException。
我认为rangeCheck应该同时检查否定和gte,或者,为了性能,两者都不应该检查。为什么rangeCheck不检查索引是否为负值?
发布于 2016-08-15 06:24:28
很简单,因为在ArrayList中,支持数组可能大于当前大小。
在当前实现中,当超过当前最大容量时,ArrayList的支持数组容量会增加1.5倍。默认的初始容量为10,当您试图将第11个元素添加到列表中时,数组将以15的容量重新分配。当您超过15时,它将增加到22,等等。
在任何给定的时间,容量都可能大于ArrayList中当前元素的数量。
检查负索引留给JVM (在支持数组上),ArrayList本身只需要在当前列表的上端进行检查。
https://stackoverflow.com/questions/38950203
复制相似问题