美文网首页
ArrayList集合类的set异常问题

ArrayList集合类的set异常问题

作者: callme周小伦 | 来源:发表于2019-10-25 19:22 被阅读0次

先做一个简单的示例说明问题

public static void main(String[] args) {
        ArrayList arrayList = new ArrayList(5);
        arrayList.set(0,1);
    }

声明一个容量为5的集合,然后第一位set赋值,会引发异常

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:657)
    at java.util.ArrayList.set(ArrayList.java:448)
    at com.qi.Test.main(Test.java:15)

ArrayList有关索引的函数通常会先进行rangeCheck()检查,我们来看一下set源码

public E set(int index, E element) {
        rangeCheck(index);

        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }

private void rangeCheck(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }

我们发现范围检查是通过size变量大小来实行的,我们再来看一下以容量为参数构造ArrayList的源码

public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

我们可以发现只是创建了容量为initialCapacity大小的数组空间,而并没有对size变量进行更改。这里就可以找到问题所在

总结: 通过indexArrayList集合类操作时,通常会对该index进行range_check,而该检查是对size变量来进行操作的。通常在添加元素或删除元素时size变化。 在创建并初始化ArrayList对象时只是生成了一定大小的数组空间,并没有修改size变量。 因此,我们不能够直接进行set赋值。

相关文章

网友评论

      本文标题:ArrayList集合类的set异常问题

      本文链接:https://www.haomeiwen.com/subject/rzdevctx.html