最近两天,有同事发现了“新大陆”。说是发现了 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 异常。
究其原因是因为,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异常的问题!
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/252170.html