Java面试基础之ArrayList操作

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

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-05-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏来自地球男人的部落格

[LeetCode] 134. Gas Station

【原题】 There are N gas stations along a circular route, where the amount of gas...

1998
来自专栏desperate633

设计模式之组合模式(Composite 模式)引入composite模式composite模式的具体实例composite模式小结

在计算机文件系统中,有文件夹的概念,文件夹里面既可以放入文件也可以放入文件夹,但是文件中却不能放入任何东西。文件夹和文件构成了一种递归结构和容器结构。 虽然文...

802
来自专栏后端沉思录

SPI概念及使用方法

SPI全称Service Provider Interfaces,用于发现接口的实现。在jdbc、日志、dubbo的设计中都使用SPI用于服务的发现。简单的以j...

2852
来自专栏Android知识点总结

SpringBoot-08-之统一化json输出与自定义异常捕获

2361
来自专栏个人随笔

论 ArrayList如何实现线程安全

一:使用synchronized关键字 二:使用Collections.synchronizedList();         假如你创建的代码如下:List<...

35414
来自专栏学习力

《Java从入门到放弃》JavaSE入门篇:练习——单身狗租赁系统

4044
来自专栏Janti

springboot之使用redistemplate优雅地操作redis

2.9K3
来自专栏程序生活

Leetcode-Easy 101. Symmetric Tree

101. Symmetric Tree 描述: 判断一个颗二叉树是否左右对称 ? 思路: 将二叉树的左右节点对放在的队列里,然后出队,判断节...

3497
来自专栏小灰灰

线程安全的容器小结

线程安全的容器 列表 线程安全的列表有 Vector , CopyOnWriteArrayList 两种,区别则主要在实现方式上,对锁的优化上; 后者主要采...

2128
来自专栏java一日一条

Java 日期时间处理

java.util.Date对象表示一个精确到毫秒的瞬间; 但由于Date从JDK1.0起就开始存在了,历史悠久,而且功能强大(既包含日期,也包含时间),所以他...

3922

扫码关注云+社区

领取腾讯云代金券