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

JAVA herman 249浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:codedq,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:codedq,之前的微信号好友位已满,备注:返现
饿了么大量招人,我内推!Java 方向!薪资不设上限,工作年龄不限!工作地点限魔都,可电话面试!简历,发我微信:codedq
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

最近两天,有同事发现了“新大陆”。说是发现了 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 异常。

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 的煞费苦心。所以,平时还是要多读读源码,多思考思考!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号1:xmtxtt(5000人已满),微信号2:xttblog(5000人已满),微信号3:codedq(超3800)。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 详解 Java ArrayList使用add、set抛出IndexOutOfBoundsException异常的问题!