String str1 = new String("1");
String str2 = new String("2");
String str3 = new String("3");
String str4 = new String("4");
String str5 = new String("5");
List 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++) {
list.remove(i);
// i--;
//System.out.println(i+" "+list.get(i)+" ");
}
System.out.println("after remove:list.size()=" + list.size());

本来预期结果应该是:

list.size()=5
after remove:list.size()=0

但实际上结果却是:

list.size()=5
after remove:list.size()=2

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

分析:

List中有5条数据,需要循环5次,

第一次数据为:1 2 3 4 5

执行完remove(0) 后,数据为 2 3 4 5  , i=1

第二次数据为:2 3 4 5

执行完remove(1) 后,数据为 2 4 5  , i=2

第三次数据为:2 4 5

执行完remove(2) 后,数据为 2 4  , i=3

此时如果加上上面注释的代码 System.out.println(i+" "+list.get(i)+" "); 循环第4、5次时就会出现异常

解决方法1:

每移过一次后,再把 i 移回来

for (int i = 0; i < list.size(); i++) {
list.remove(i);
i--;
}

解决方法2:

先删除后面的元素

for (int i = list.size()-1; i >= 0; i--) {
list.remove(i);
}

原文出处:

[1] cbjcry, 使用List中remove方法时需要注意的问题, https://blog.csdn.net/cbjcry/article/details/70154568

注:转载后,已经重复验证了分析过程以及解决方案的正确与有效。

使用List中remove方法时需要注意的问题的更多相关文章

  1. List 调用 remove 方法时抛出 java.lang.UnsupportedOperationException 异常原因

    原因 使用 Arrays.asList(arr) 转换的 List 并不能进行 add 和 remove 操作.       Arrays.asList(arr) 返回的类型是 Aarrays$Arr ...

  2. 覆盖Django mysql model中save方法时碰到的一个数据库更新延迟问题

    最近有一个需求,通过django的admin后台,可以人工配置5张表的数据,这些数据进行一些业务规则处理后会统一成一份数据缓存在一个cache之中供服务端业务访问,因而任何一张表的数据更新(增.删.改 ...

  3. 022——VUE中remove()方法的使用:

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  5. Struts2 Action中的方法命名不要以get开头

    偶然发现,在调用一个action中的某个方法时,会自动调用另一个无关的方法,找了好久,最后发现是方法命名的问题,方法命名以get开头,action会自动调用!所以,以后再写action中的方法时尽量不 ...

  6. react:在一个组件中调用别的组件中的方法

    先介绍一下要解决的问题:react中一个组件A和一个组件B,其中B是被connect(connect是redux中的方法)包装过的组件,包装成BContainer,A和BContainer的关系是兄弟 ...

  7. html网页访问WebAPI中的方法遇到的问题

      1.移动端访问远程服务时,建议使用WebAPI 2.用不同浏览器访问WebAPI时返回的文本格式是不同的,Chrome Firefox将在浏览器中以XML形式显示此列表,IE浏览器将获得Json格 ...

  8. Iterator的remove方法可保证从源集合中安全地删除对象(转)

    如果对正在被迭代的集合进行结构上的改变(即对该集合使用add.remove或clear方法),那么迭代器就不再合法(并且在其后使用该迭代器将会有ConcurrentModificationExcept ...

  9. 遍历并remove HashMap中的元素时,遇到ConcurrentModificationException

    遍历并remove HashMap中的元素时,遇到ConcurrentModificationException for (Map.Entry<ImageView, UserConcise> ...

随机推荐

  1. 用axios.all处理并发请求

    如果我们需用在两个接口同时完成后,然后在执行一些逻辑,我们可以使用axios.all处理并发请求,如下所示: function getUserAccount() { return axios.get( ...

  2. mysql编译安装下载地址(官网)

    https://dev.mysql.com/get/Downloads/MySQL-version number/mysql-version number.tar.gz 把这个地址上面的版本号改成自己 ...

  3. redis-Jedis连接集群

    关闭防火墙或把端口加入防火墙 一.通过代码 @Test public void testJedisCluster() throws Exception { //创建一连接,JedisCluster对象 ...

  4. Codeforces I. Producing Snow(优先队列)

    题目描述: C. Producing Snow time limit per test 1 second memory limit per test 256 megabytes input stand ...

  5. 图论篇2——最小生成树算法(kurskal算法&prim算法)

    基本概念 树(Tree) 如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree) 无向连通图G的一个子图如果是一颗包含G的所有顶点的树,则该子图称为G的生成树. 生成 ...

  6. mocker-api 原理

    项目网址:https://github.com/jaywcjlove/mocker-api 作用有2个: 运行dev命令后,访问本地开启服务接口,模拟数据: 访问本机接口时,代理到其它服务器,即调用其 ...

  7. Css背景设置 、

    每天进步一小步,一年进步一大步. 第一次发博客园文章,主要记录自己学习的一个过程. CSS3 背景 CSS3 包含多个新的背景属性,它们提供了对背景更强大的控制. background-size ba ...

  8. JMeter5.1开发Java协议接口脚本【待完成】

    JMeter5.1开发Java协议接口脚本

  9. wordpress默认css样式class和id集合

    你是否想过如何设计WordPress主题的不同元素?每个主题都不一样,但是有一些CSS的class和id是由WordPress生成的.我们将逐一介绍一些最重要的默认WordPress样式,方便初学者快 ...

  10. gettid和pthread_self区别

    http://blog.csdn.net/rsyp2008/article/details/45150621 1 线程ID获取方法 Linux下获取线程有两种方法: 1)gettid或者类似getti ...