ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

误区:关于List.remove在for循环中出现问题的解决方案

2022-01-04 20:04:18  阅读:239  来源: 互联网

标签:String 解决方案 list remove new List abcde size


文章来源转载自:https://blog.csdn.net/walter247443819/article/details/53927416

在java中对list进行操作很频繁,特别是进行list启遍历,这些操作我们都会,也很熟悉,但是对java中list进行删除元素,remove list中的元素就不怎么熟悉了吧,可以说很陌生,是实际操作中也很容易出错,先看看
下面这个java中如何remove list 中的元素吧.

public class Test050 {
    public static void main(String[] args) {
        String str1 = new String("abcde");
        String str2 = new String("abcde");
        String str3 = new String("abcde");
        String str4 = new String("abcde");
        String str5 = new String("abcde");
        List<String> list = new ArrayList<>();

        list.add(str1);
        list.add(str2);
        list.add(str3);
        list.add(str4);
        list.add(str5);

        System.out.println("list.size()=" + list.size());
        for (int i = 0; i < list.size(); i++) {
            if (((String) list.get(i)).startsWith("abcde")) {
                list.remove(i);
            }
        }
        System.out.println("after remove:list.size()=" + list.size());
    }
}

大家觉得这个程序打印出来的结果是多少呢?

Java代码
运行结果不是:

list.size()=5

after remove:list.size()=0
而是:

Java代码
list.size()=5

after remove:list.size()=2
这是怎么回事呢?到底要如何remove list 中的元素呢?


原因:List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素没有被读取

怎么解决?有三种方法可以解决这个问题:

1.倒过来遍历list

Java代码
for (int i = list.size()-1; i > =0; i--) {
  if (((String) list.get(i)).startsWith("abcde")) {
   list.remove(i);
  }
}
2.每移除一个元素以后再把i移回来

Java代码
for (int i = 0; i < list.size(); i++) {
  if (((String) list.get(i)).startsWith("abcde")) {
   list.remove(i);
   i=i-1;
  }
}
3.使用iterator.remove()方法删除
Java代码
if (null != list && list.size() > 0) {
    Iterator it = list.iterator();  
    while(it.hasNext()){
        Student stu = (Student)it.next(); 
        if (stu.getStudentId() == studentId) {
            it.remove(); //移除该对象
        }
    }
}

标签:String,解决方案,list,remove,new,List,abcde,size
来源: https://blog.csdn.net/weixin_42273775/article/details/122310373

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有