【问题标题】:Why does ArrayList#rangeCheck not check if the index is negative?为什么 ArrayList#rangeCheck 不检查索引是否为负?
【发布时间】:2016-08-15 06:22:32
【问题描述】:

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 应该同时检查负数和 gte ,或者,为了性能,不应该检查。 为什么 rangeCheck 不检查索引是否为负?

【问题讨论】:

  • 因为没必要。随后的数组访问已经做到了。正如你的报价所说。

标签: java arraylist


【解决方案1】:

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

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

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

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

【讨论】:

猜你喜欢
  • 2020-02-07
  • 2011-01-09
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
相关资源
最近更新 更多