详解 Java ArrayList使用add、set抛出IndexOutOfBoundsException异常的问题!

最近两天,有同事发现了“新大陆”。说是发现了 JDK 的 bug,其实是没理解 JDK 的设计思路!

问题的起因是因为,这位同事在使用 ArrayList 时,抛出了 IndexOutOfBoundsException 异常。

List xttblog = new ArrayList<Integer>();
xttblog.add(2, 8);

// 或者
xttblog = new ArrayList<Integer>(10);
xttblog.add(2, 8);

// 或者
xttblog = new ArrayList<Integer>(10);
xttblog.set(2, 8);

// 或者
xttblog = new ArrayList<Integer>();
xttblog.add(1);
xttblog.add(2);
xttblog.clear();
xttblog.set(2,6);

比如上面的几种用法,都会导致这段代码抛出 IndexOutOfBoundsException 异常。

详解 Java ArrayList使用add、set抛出IndexOutOfBoundsException异常的问题!
IndexOutOfBoundsException

究其原因是因为,set(int index, E element) 方法和 add(int index, E element) 方法中都会检测数组的边界。

但是,你细细的看上面的例子,我们 add 或者 set 的时候,都没有超过 ArrayList 的 size,为什么还会报越界问题呢?

这是因为,ArrayList 的底层本质上还是一个数组。ArrayList 本身是要求自己的数组要保持连续性。每当删除一个元素,我们都会移动数组的。因为 size 大小变了,所以必须要移动。

而上面的代码中,因为前面的元素都没有插入数据。size 为 0,此时你要跳过前面的 size 部分插入元素,就会发生越界。

现在假设,不报越界的异常。即使你插入成功了,当前 size 随之改为 1,后面我们再调用 add(E e) 进行添加元素,就会跳过下标为 0 的位置。然后当 add 到我们刚才 set(int index, E element) 方法和 add(int index, E element) 的位置的时候,就会发生覆盖。

所以,你现在应该明白了 JDK 设计 ArrayList 的煞费苦心。所以,平时还是要多读读源码,多思考思考!

详解 Java ArrayList使用add、set抛出IndexOutOfBoundsException异常的问题!

: » 详解 Java ArrayList使用add、set抛出IndexOutOfBoundsException异常的问题!

原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/252170.html

(0)
上一篇 2022年5月4日
下一篇 2022年5月4日

相关推荐

发表回复

登录后才能评论