首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ArrayList#rangeCheck不检查索引是否为负值?

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

Stack Overflow用户
提问于 2016-08-15 06:22:32
回答 1查看 1.1K关注 0票数 6

ArrayList#getsetremove首先调用rangeCheck方法。此方法不检查索引是否为负值。它只检查索引是否大于或等于数组的长度。Javadoc解释了原因;如果索引为负值,数组访问将抛出一个ArrayIndexOutOfBoundsException

代码语言:javascript
复制
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不检查索引是否为负值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-15 06:24:28

很简单,因为在ArrayList中,支持数组可能大于当前大小。

在当前实现中,当超过当前最大容量时,ArrayList的支持数组容量会增加1.5倍。默认的初始容量为10,当您试图将第11个元素添加到列表中时,数组将以15的容量重新分配。当您超过15时,它将增加到22,等等。

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

检查负索引留给JVM (在支持数组上),ArrayList本身只需要在当前列表的上端进行检查。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38950203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档