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