list 集合addAll 和 add 方法小坑
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 方法小坑的更多相关文章
- 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. ...
- 【转载】C#中Add方法将往List集合末尾添加相应元素对象
在C#的List集合操作中,有时候需要将符合条件的对象添加到已有List集合中的末尾,此时就需要使用到List集合的Add方法,Add方法的作用为将对应的元素添加到List集合末尾,Add方法签名为v ...
- TreeSet集合的add()方法源码解析(01.Integer自然排序)
>TreeSet集合使用实例 >TreeSet集合的红黑树 存储与取出(图) >TreeSet的add()方法源码 TreeSet集合使用实例 package cn.itca ...
- List的add方法与addAll方法的区别、StringBuffer的delete方法与deleteCharAt的区别
List的add方法与addAll方法 区别 add add是将传入的参数作为当前List中的一个Item存储,即使你传入一个List也只会另当前的List增加1个元素 addAll addAll是传 ...
- Java集合工具类使用的一些坑,Arrays.asList()、Collection.toArray()、foreach
Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...
- java集合_collection 中的方法 通过Arraylist来体现
import java.util.*; /* Collection定义了集合框架的共性功能.1,添加 add(e); addAll(collection); 2,删除 remove( ...
- [javaSE] 集合框架(共性方法)
Collection接口的常用方法 add(),添加一个元素 addAll(),添加一组元素 clear(),清空 remove(),移除一个 removeAll(),移除一组 size(),元素个数 ...
- 【手记】小心在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这三个数,不可能返回其它 ...
- day07-列表类型/元组类型/字典类型/集合类型内置方法
目录 列表类型内置方法 元组类型内置方法 字典类型内置方法 集合类型内置方法 列表类型内置方法 用来存多个元素,[]内用逗号隔开任意数据类型的元素 1. list()强制类型转换 print(list ...
随机推荐
- 【转】有关onpropertychange事件
<div style="border:1px solid #fc0;height:24px;width:300px;" id="target">&l ...
- POJ 1579 Function Run Fun 【记忆化搜索入门】
题目传送门:http://poj.org/problem?id=1579 Function Run Fun Time Limit: 1000MS Memory Limit: 10000K Tota ...
- idea原生ajax数据处理(增删改查)
项目名称:Bookstore UI界面 项目文件 操作: jsp代码 <%@ page import="dao.BookDAO" %> <%@ page impo ...
- linux mariadb
https://www.linuxidc.com/Linux/2016-03/128880.htm -- sql 导入 接着输入你所导入到Centos下的数据库文Student.sql文件的位置例如: ...
- poj_1306_Combinations
Computing the exact number of ways that N things can be taken M at a time can be a great challenge w ...
- visio studio code 用chrom启动打开本地html
{ // 使用 IntelliSense 了解相关属性. // 悬停以查看现有属性的描述. // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linki ...
- React学习(3)——Router路由的使用和页面跳转
React-Router的中文文档可以参照如下链接: http://react-guide.github.io/react-router-cn/docs/Introduction.html 文档中介绍 ...
- 【PHP】Laravel将HTML实体转换回普通字符
问题 最近一个laravel模板的项目需要用到summernote富文本编辑器,内容保存到数据库里是原始的html代码.再读取出来时使用htmlspecialchars_decode()对内容进行转换 ...
- mac phpstorm 破解方法
方法参考如下链接: 来源:http://www.cnblogs.com/zyliang/p/6148960.html
- 初学tiny4412
1.解压友善之臂提供的uboot make tiny4412_config make 然后将sd卡插到电脑上,编辑虚拟机,选择对应的usb口(usb3.0兼容),如果没有usb3.0,可能是虚拟机版本 ...