首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java面试基础之ArrayList操作

Java面试基础之ArrayList操作

作者头像
PhoenixZheng
发布2018-08-07 16:19:47
2620
发布2018-08-07 16:19:47
举报

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, 所以当删除的元素不在中间的话没问题, 万一是在中间,那就崩溃了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题分析
  • 原因
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档