ArrayList应该是Java开发中经常见到的数据结构了。 曾经在一个面试中遇到这么个问题,
请分析下面的代码错误在哪里,为什么错误?
ArrayList<Bean> beans = new ArrayList<>();
beans.add(new Bean("1"));
beans.add(new Bean("2"));
...
beans.add(new Bean("100"));
for(Bean bean : beans) {
if(bean.getTag == 5) {
beans.remove(bean);
}
}
如果你不能一眼看出来问题的话, 那么可能平时开发中也忽略了这个问题呢。
这里面 Bean只是一个简单的类,跟代码的问题关系不大。 关键的代码是这一行,
beans.remove(bean);
如果这里移除的是 ArrayList最后一个元素, 那么一般不会有什么问题, 但是如果移除的是 ArrayList 中间的某一个元素, 那么程序运行到这里就会抛出异常 IndexOutOfBoundsException
其实原因在于, remove操作之后 list的 size会发生变化, 而迭代的基数并没有及时调整, 因此最终会遍历到一个超过remove后size的边界。 虽然for循环中去删除元素本身逻辑理解上是没问题的, 但是因为 remove操作会改变list的 size, 所以当删除的元素不在中间的话没问题, 万一是在中间,那就崩溃了。