[JAVA] 集合类增删改,Iterator, ListIterator
2016-12-23 10:57
316 查看
不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。
边遍历,边删除,出现异常: java.util.ConcurrentModificationException
![](https://img-blog.csdn.net/20161223104904846?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHdqNTI4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
集合不可以一边遍历一边删除。需要使用迭代器(iterator)。
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
Source Code:
Result:
边遍历,边删除,出现异常: java.util.ConcurrentModificationException
private void useListRemove(){ List<String> list = getList(); int index = 0; for(String temp : list){ if("aa".equals(temp)){ // list.set(index, "dd"); list.remove(temp); } index ++; } System.out.println("----User List: " + list.toString()); }
集合不可以一边遍历一边删除。需要使用迭代器(iterator)。
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
Source Code:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.ListIterator; public class IteratorDemo { public static void main(String[] args) { // TODO Auto-generated method stub IteratorDemo demo = new IteratorDemo(); demo.useListRemove(); demo.useIteratorRemove(); demo.useListIteratorAdd(); } private void useListRemove(){ List<String> list = getList(); int index = 0; for(String temp : list){ if("aa".equals(temp)){ // Update list.set(index, "dd"); // list.remove(temp); } index ++; } System.out.println("----User List: " + list.toString()); } private void useIteratorRemove(){ List<String> list = getList(); Iterator<String> iterator = list.iterator(); while(iterator.hasNext()){ String temp = iterator.next(); if("aa".equals(temp)){ // Delete iterator.remove(); } } System.out.println("----Use Iterator Remove: " + list.toString()); } private void useListIteratorAdd(){ List<String> list = getList(); ListIterator<String> listIterator = list.listIterator(); while(listIterator.hasNext()){ String temp = listIterator.next(); if("aa".equals(temp)){ listIterator.remove(); }else if("bb".equals(temp)){ // Add listIterator.add("dd"); } } System.out.println("----Use ListIterator Add and Remove: " + list.toString()); } private List<String> getList(){ List<String> list = new ArrayList<String>(); list.add("aa"); list.add("bb"); list.add("cc"); return list; } }
Result:
相关文章推荐
- JAVA基础再回首(十四)——集合框架、Collection接口、迭代器Iterator、List接口、ListIterator列表迭代器
- Java 集合中关于Iterator 和ListIterator的详解
- java:集合输出之Iterator和ListIterator
- Java类集框架——Iterator和ListIterator 迭代器的使用(遍历集合)
- java:集合输出之Iterator和ListIterator二
- java:集合输出Iterator,ListIterator,foreach,Enumeration
- JAVA提高篇(31)--Iterator和ListIterator 迭代器的使用(遍历集合)
- Java集合(3)——ListIterator接口源码 & ListIterator接口与Iterator接口辨析
- Java 集合系列18之 Iterator和Enumeration比较
- Java核心类库——集合的迭代(遍历) Iterator接口
- Map、Set、Iterator迭代详解与 Java平台的集合框架
- Java Iterator与ListIterator的区别
- 黑马程序员_集合1_(ArrayList、LinkedList、Vector、Iterator、ListIterator)
- java集合之迭代器ListIterator
- [Java 13 类集合] Iterator, Properties, Collections
- Java基础---集合框架---迭代器、ListIterator、Vector中枚举、LinkedList、ArrayList、HashSet、TreeSet、二叉树、Comparator
- Java基础---集合框架---迭代器、ListIterator、Vector中枚举、LinkedList、ArrayList、HashSet、TreeSet、二叉树、Comparator
- Java类集--Iterator接口、ListIterator接口、foreach及Enumeration接口
- 08.集合框架(一)【集合概述】【接口Collection,Iterator,List,ListIterator】【类LinkedList,ArrayList】
- Java中遍历集合的三种方法(for循环、for循环jdk1.5的新方法、Iterator接口)