1.问题

我们经常会遍历 list集合,在遍历的过程中,如果在遍历的过程中添加了 add()  或者 addAll() 方法修改了遍历的list列表,那么会报错.

代码演示:

        List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
for(int i = 0;i<list.size();i++){
System.out.println(i);
}

这段代码的结果大家都知道, 0  1  2;

但是如果在遍历的过程中修改了list 的内容

        List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
for(int i = 0;i<list.size();i++){
System.out.println(i);
list.add(4);
}

那么就会出现死循环,原因是list实现是数组,list.size() 在add之后 size() 会增加,也就是说 list的下标一直在增加, list.size()的值也一直在增加,所以出现了死循环.addAll()方法同理

而且jdk文档也已经说明了这一点:

添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序(可选操作)。如果在操作正在进行中修改了指定的 collection,那么此操作的行为是不确定的(注意,如果指定的 collection 是此列表,并且它是非空的,则会发生这种情况。)

2.解决:

创建一个临时list变量就可以解决.

        List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
List<Object> temp = Arrays.asList(list.toArray());
for(int i = 0;i<temp.size();i++){
System.out.println(i);
list.add(4);
}

如图,在遍历前创建一个temp变量即可. 注意:因为toArray()方法返回的是Object类型,所以只能创建List<Object>,大家有更好的解决可以和我交流交流.

附上刚刚完成的代码,用递归实现遍历树状图;

    //递归获取架构下级id
private static List<Integer> selectAllStructLowLevelIdById(List<Integer> list) {
if(list == null || list.isEmpty()){
return list;
}else{
//创建临时变量,用来遍历
List<Object> template = Arrays.asList(list.toArray()); for(int i = 0;i<template.size();i++){
List<Integer> ids = attendanceMapper.selectStructLowLevelIdById((Integer)template.get(i));
list.addAll(selectAllStructLowLevelIdById(ids));
}
return list;
}
}

数学真是伟大.

list 集合addAll 和 add 方法小坑的更多相关文章

  1. php 5.2 版本isset()方法小坑

    PHP 5.2.17p1 (cli) (built: May 28 2015 16:15:30)Copyright (c) 1997-2010 The PHP GroupZend Engine v2. ...

  2. 【转载】C#中Add方法将往List集合末尾添加相应元素对象

    在C#的List集合操作中,有时候需要将符合条件的对象添加到已有List集合中的末尾,此时就需要使用到List集合的Add方法,Add方法的作用为将对应的元素添加到List集合末尾,Add方法签名为v ...

  3. TreeSet集合的add()方法源码解析(01.Integer自然排序)

    >TreeSet集合使用实例 >TreeSet集合的红黑树 存储与取出(图) >TreeSet的add()方法源码     TreeSet集合使用实例 package cn.itca ...

  4. List的add方法与addAll方法的区别、StringBuffer的delete方法与deleteCharAt的区别

    List的add方法与addAll方法 区别 add add是将传入的参数作为当前List中的一个Item存储,即使你传入一个List也只会另当前的List增加1个元素 addAll addAll是传 ...

  5. Java集合工具类使用的一些坑,Arrays.asList()、Collection.toArray()、foreach

    Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...

  6. java集合_collection 中的方法 通过Arraylist来体现

    import java.util.*; /* Collection定义了集合框架的共性功能.1,添加    add(e);    addAll(collection); 2,删除    remove( ...

  7. [javaSE] 集合框架(共性方法)

    Collection接口的常用方法 add(),添加一个元素 addAll(),添加一组元素 clear(),清空 remove(),移除一个 removeAll(),移除一组 size(),元素个数 ...

  8. 【手记】小心在where中使用NEWID()的大坑 【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题 【C#】组件分享:FormDragger窗体拖拽器 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

    [手记]小心在where中使用NEWID()的大坑 这个表达式: ABS(CHECKSUM(NEWID())) % 3 --把GUID弄成正整数,然后取模 是随机返回0.1.2这三个数,不可能返回其它 ...

  9. day07-列表类型/元组类型/字典类型/集合类型内置方法

    目录 列表类型内置方法 元组类型内置方法 字典类型内置方法 集合类型内置方法 列表类型内置方法 用来存多个元素,[]内用逗号隔开任意数据类型的元素 1. list()强制类型转换 print(list ...

随机推荐

  1. 【转】深度分析Java的ClassLoader机制(源码级别)

    原链接 Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中, JVM在加载类的时候,都是通过ClassLoa ...

  2. Ubuntu 16.04 源码方式安装 JDK

    1.去官网下载JDK http://www.oracle.com/technetwork/articles/javase/index-jsp-138363.html 2.下载完成后,创建一个我们将要安 ...

  3. Mysql索引学习笔记

    1.btree索引与hash索引 下列范围查询适用于 btree索引和hash索引: SELECT * FROM t1 WHERE key_col = 1 OR key_col IN (15,18,2 ...

  4. centos7下javac:未找到命令的问题

    在linux下编译java程序,执行javac编译生成class文件时,在centos7终端输入如,javac hello.java    会提示未找到指令,但用java -verison测试环境变量 ...

  5. reactJs 基础

    react不是一个完整的mvc,mvvm框架. react跟web components 不冲突  背景原理:基于React进行开发时所有的DOM构造都是通过虚拟DOM进行,每当数据变化时,React ...

  6. sql server 自增长显式添加值

    如果想在自增列添加数据,会提示我们不能插入显式值 解决:

  7. SpringBoot学习15:springboot异常处理方式5(通过实现HandlerExceptionResolver类)

    修改异常处理方式4中的全局异常处理controller package com.bjsxt.exception; import org.springframework.context.annotati ...

  8. 常用的标准SQL 语句

    1.创建数据库的语句如下: Create database databaseName 上述语句创建一个名字叫 databaseName 的数据库2.删除数据库的语句如下. Drop database ...

  9. 【赛事总结】◇赛时·8◇ AGC-027

    [赛时·8]AGC-027 日常AGC坑……还好能涨Rating +传送门+ ◇ 简单总结 感觉像打多校赛一样,应该多关注一下排名……考试的时候为了避免影响心态,管都没有管排名,就在那里死坑B题.最后 ...

  10. dedecms添加/编辑文章如何把附加选项去掉默认勾选状态

    1.去掉添加时默认勾选状态. 在 系统->系统基本参数->其它选项 中,如图中的三个选项选择否即可. 设置完后可以看到添加时已经默认不勾选,但是编辑文章时还是默认勾选状态. 2.去掉编辑时 ...