List集合和iterator并发异常处理
一:List接口:
子类:ArrayList LinkedList
特点:Unlike sets, lists typically allow duplicate elements.不像set集合,List集合允许元素重复。
The List interface provides four methods for positional (indexed) access to list elements. Lists (like Java arrays) are zero based. List集合提供一些关于索引的访问元素的方法,和数组一样起始索引:0;
也就是说List集合是存取是有序的。比如存:11,12,13.取元素也是11,12,13.
List集合比对2个对象使用equals()比较。
也就是说之前Collection的方法,我们可以用精确的索引来操作。
package test09; import java.util.ArrayList;
import java.util.List; public class List_Demo {
public static void main(String...args){
list_test();
}
public static void list_test(){
List<Integer> li_te=new ArrayList<>();
li_te.add();
li_te.add();
li_te.add();
li_te.add();
li_te.add();
li_te.add(,);//指定位置添加元素。
System.out.print(li_te);
li_te.remove();//指定位置删除元素。
System.out.print(li_te);
Integer get_el=li_te.get();
System.out.print(get_el);//指定位置获取元素,如果超出索引报错误:IndexOutOfBoundsException
li_te.set(,);//replace替换指定位置的元素。
System.out.print(li_te);
for(Integer i=;i<li_te.size();i++){
System.out.print(li_te.get(i));//使用索引进行迭代。
}
}
}
二:迭代器Iterator并发异常处理:
看如下代码:
package test09; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class List_It {
public static void main(String...args){
op_It();
}
public static void op_It(){
List<String> str_list=new ArrayList<>();
str_list.add("i");
str_list.add("b");
str_list.add("n");
str_list.add("m");
Iterator<String> str_it=str_list.iterator();
while (str_it.hasNext()){
String test_str=str_it.next();
if (test_str.equals("m")){
str_list.add("k");
}
}
}
}
报如下的错误:
Exception in thread "main" java.util.ConcurrentModificationException
这是为什么呢?
这是因为在我们使用迭代器Iterator的时候,同时对集合元素进行操作,但是迭代器并不知道集合发生变化,所以抛出如上的错误。
解决方法:解决并发引起的错误,在迭代的集合元素的时候,不要进行相关的元素操作。
或者使用listiterator方法。
ListIterator<E>
listIterator()
将如上的代码进行修改:
package test09; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator; public class List_It {
public static void main(String...args){
op_It();
}
public static void op_It(){
List<String> str_list=new ArrayList<>();
str_list.add("i");
str_list.add("b");
str_list.add("n");
str_list.add("m");
ListIterator<String> str_it=str_list.listIterator();
while (str_it.hasNext()){
if(str_it.next().equals("m")){
str_it.add("");
}
}
System.out.print(str_list);
}
}
在迭代的过程中,如果不想不引起并发异常,可以使用ListIterator迭代器,在迭代的过程对数组的修改。只有List有这特性,因为List有索引。
List集合和iterator并发异常处理的更多相关文章
- 集合和Iterator迭代器
集合 集合是java中提供的一种容器,可以用来存储多个数据. 注意: ①.集合只能存放对象.比如你存一个 int 型数据 1放入集合中, 其实它是自动转换成 Integer 类后存入的,Java中每一 ...
- 15.Colection集合和Iterator接口.md
目录 1.Collection 1.1概念 1.1遍历方法-Lambda表达式 1.2遍历方法-Iterator接口 1.3使用Lambda方法遍历Iterator接口 1.4使用Foreach方法遍 ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- Java集合的实现细节—Set集合和Map集合
Set:代表无序.不可重复的集合 Map:代表key-value对集合,也称为关联数组 从表面上看,Set和Map相似性很少,但实际上可以说Map集合时Set集合的扩展. 1.Set集合和Map集合的 ...
- java基础33 Set集合下的HashSet集合和TreeSet集合
单例集合体系: ---------| collection 单例集合的根接口--------------| List 如果实现了list接口的集合类,具备的特点:有序,可重复 注:集合 ...
- quartz集群分布式(并发)部署解决方案-Spring
项目中使用分布式并发部署定时任务,多台跨JVM,按照常理逻辑每个JVM的定时任务会各自运行,这样就会存在问题,多台分布式JVM机器的应用服务同时干活,一个是加重服务负担,另外一个是存在严重的逻辑问题, ...
- 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq
5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...
- 【读书笔记】【深入理解ES6】#7-Set集合和Map集合
ES6新标准中将Set集合和Map集合添加到JS中. ES5中Set集合和Map集合 在ES5中,开发者们用对象属性来模拟这两种集合. var set = Object.create(null); s ...
- quartz集群分布式(并发)部署解决方案
项目中使用分布式并发部署定时任务,多台跨JVM,按照常理逻辑每个JVM的定时任务会各自运行,这样就会存在问题,多台分布式JVM机器的应用服务同时干活,一个是加重服务负担,另外一个是存在严重的逻辑问题, ...
随机推荐
- 使用swiper 轮播插件ajax 请求加载图片时,无法滑动问题
因为图片是动态创建的,在插件开始初始化时,文档流中没用图片,故没有创建相应宽度.通过调整js加载顺序,问题还是没有解决. 最后找到swiper插件 api 有属性是可以根据内容变动,自动初始化插件的, ...
- vue的v-html插值样式问题
content使用html插入文本和图片 使用scoped样式,渲染失败. 原因: 解决方案: 采用全局样式 或另外再加style标签单独渲染
- BZOJ4977: [[Lydsy1708月赛]跳伞求生
传送门 直接贪心 考虑到 \(n\) 个人的贡献都是 \(a_i\),另外 \(m\) 个人的贡献都是 \(c_i-b_i\) 首先 \(a_i>b_j\) 的限制不好做,所以将 \(a,b\) ...
- git push 提示 Everything up-to-date
第一次在 Google Code 上弄项目,注册完毕后,尝试增加一个新文件用以测试 Git 是否好好工作.结果在 Push 时却显示 Every up-to-date,检查文件时却发现实际上一个都没更 ...
- ida不错的插件记录
IDASkins 地址 https://github.com/zyantific/IDASkins 作用 ida黑色皮肤插件 IDAFuzzy 地址 https://github.com/Ga-ryo ...
- okhttp3带cookie请求
Request经常都要携带Cookie,上面说过request创建时可以通过header设置参数,Cookie也是参数之一.就像下面这样: Request request = new Request. ...
- Vue2学习笔记:过渡效果css
过渡效果 Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加 entering/leaving 过渡 <!DOCTYPE html> <html ...
- node环境和浏览器的区别
一.全局环境下this的指向 在node中this指向global而在浏览器中this指向window,这就是为什么underscore中一上来就定义了一 root: 1 var root = typ ...
- 执行SQL的DbHelperSQL
using System; using System.Collections; using System.Collections.Specialized; using System.Data; usi ...
- iOS7中UIView的animateKeyframesWithDuration方法讲解
iOS7中UIView的animateKeyframesWithDuration方法讲解 在iOS7中,给UIView添加了一个方法用来直接使用关键帧动画而不用借助CoreAnimation来实现,那 ...