Java集合--ArrayList遍历删除元素

面试问题:ArrayList在遍历移除元素会出现什么情况?

复制代码
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TestList2 {
    
    public static void main(String[] args) {
        
        List<String> list = new ArrayList<String>();
        
        list.add("马");
        list.add("张");
        list.add("张");
        list.add("马");
        list.add("马");
        
//        int size = list.size();
//        for(int i=0; i<size; i++) {
//            if("张".equals(list.get(i))) {
//                list.remove(i);
//            }
//        }
        //java.lang.IndexOutOfBoundsException: Index: 4, Size: 4    
        //数组下标越界异常
        
        
//        for(int i=0; i<list.size(); i++) {
//            if("张".equals(list.get(i))) {
//                list.remove(i);
//            }
//        }
        //移除结果:马 张 马  马
        //遍历删除数组小标为1的张后,数组下标为2的张向前移动下标变为1,
        //下标为1已经遍历过所以漏删了
        
        //以上情形两种解决方案:
        //变换下标
//        for(int i=0; i<list.size(); i++) {
//            if("张".equals(list.get(i))) {
//                list.remove(i);
//                i--;
//            }
//        }
        
        //倒序移除元素,不影响数组顺序
        for(int i=list.size()-1; i>-1; i--) {
            if("张".equals(list.get(i)))
                list.remove(i);
        }
        //移除结果: 马 马 马
        
//        for(String str : list) {
//            if("张".equals(str)) {
//                list.remove(str);
//            }
//        }
        // java.util.ConcurrentModificationException  并发修改异常
        // 原因https://www.cnblogs.com/huangjinyong/p/9455163.html
        //解决方案:使用Iterator迭代器的remove()

        
//        Iterator<String> iterable = list.iterator();
//        while(iterable.hasNext()) {
//            if("张".equals(iterable.next())) {
//                iterable.remove();
//            }
//        }
        //移除结果: 马 马 马
        
        for(int i=0; i<list.size(); i++) {
            System.out.println(list.get(i));
        }
        
    }
    
}
复制代码

 

posted @   尘世间迷茫的小书童  阅读(685)  评论(0编辑  收藏  举报
编辑推荐:
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
点击右上角即可分享
微信分享提示