【发布时间】:2016-08-15 06:22:32
【问题描述】:
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 应该同时检查负数和 gte ,或者,为了性能,不应该检查。 为什么 rangeCheck 不检查索引是否为负?
【问题讨论】:
-
因为没必要。随后的数组访问已经做到了。正如你的报价所说。