关于ArrayList$add(int index, E object)方法

发布于 2021-11-27 00:29:17 字数 1577 浏览 783 评论 5

ArrayList有一个构造方法是带容量参数的

public ArrayList(int capacity) {
        if (capacity < 0) {
            throw new IllegalArgumentException("capacity < 0: " + capacity);
        }
        array = (capacity == 0 ? EmptyArray.OBJECT : new Object[capacity]);
    }



此时,我构建一个 ArrayList对象

ArrayList<String> lables=new ArrayList<String>(6);



根据以上的构造函数,那么这时array=new Object[6],它的容量应该是6,,那么当我调用 ArrayList$add(int index, E object)方法时,看如下源码:

public void add(int index, E object) {
        Object[] a = array;
        int s = size;
        if (index > s || index < 0) {
            throwIndexOutOfBoundsException(index, s);
        }

        if (s < a.length) {
            System.arraycopy(a, index, a, index + 1, s - index);
        } else {
            // assert s == a.length;
            Object[] newArray = new Object[newCapacity(s)];
            System.arraycopy(a, 0, newArray, 0, index);
            System.arraycopy(a, index, newArray, index + 1, s - index);
            array = a = newArray;
        }
        a[index] = object;
        size = s + 1;
        modCount++;
    }



IndexOutOfBoundsException的判断依据为什么不是根据array的大小来判断的,我们初始已经申请了容量大小6,理应应该是可以直接使用add(5,"test"),为什么这样设计


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

少女净妖师 2021-11-27 17:00:32

list size 是当前元素个数(计数器) ,如果当前的元素超过了Array的length(这个就是你的capacity),就无法存储导致数据存储异常,list基于数组来存储元素,要保证数据被正确存储 且不越界。

残花月 2021-11-27 16:19:12

引用来自“有明丶”的评论

你看代码里已经很明确了,add的时候先比较了当前list的size,这个size是当前list内元素数量,不是arraylist的容量。

明媚如初 2021-11-27 13:16:04

你看代码里已经很明确了,add的时候先比较了当前list的size,这个size是当前list内元素数量,不是arraylist的容量。

岁月打碎记忆 2021-11-27 12:59:39

没人知道吗

睫毛上残留的泪 2021-11-27 11:31:20

引用来自“有明丶”的评论

你看代码里已经很明确了,add的时候先比较了当前list的size,这个size是当前list内元素数量,不是arraylist的容量。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文