美文网首页
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