1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 容器删除元素后迭代器失效_使用迭代器遍历容器元素

容器删除元素后迭代器失效_使用迭代器遍历容器元素

时间:2019-10-28 01:33:24

相关推荐

容器删除元素后迭代器失效_使用迭代器遍历容器元素

迭代器为我们提供了统一的遍历容器的方式。

1、Iterator源码分析

public Iterator<E> iterator() {return new Itr();}private class Itr implements Iterator<E> {int cursor; // index of next element to returnint lastRet = -1; // index of last element returned; -1 if no suchpublic boolean hasNext() {return cursor != size;}@SuppressWarnings("unchecked")public E next() {int i = cursor;Object[] elementData = ArrayList.this.elementData;cursor = i + 1;return (E) elementData[lastRet = i];}public void remove() {ArrayList.this.remove(lastRet);cursor = lastRet;lastRet = -1;expectedModCount = modCount;}}private class ListItr extends Itr implements ListIterator<E> {ListItr(int index) {super();cursor = index;}public boolean hasPrevious() {return cursor != 0;}public int nextIndex() {return cursor;}public int previousIndex() {return cursor - 1;}@SuppressWarnings("unchecked")public E previous() {int i = cursor - 1;Object[] elementData = ArrayList.this.elementData;cursor = i;return (E) elementData[lastRet = i];}public void set(E e) {}public void add(E e) {}}

2、迭代器遍历List/Set集合

import java.util.ArrayList;import java.util.Iterator;import java.util.ListIterator;public class TestListItr {public static void main(String[] args) {ArrayList<String> list = new ArrayList<String>();for (int i = 0; i < 5; i++) {list.add("a" + i);}System.out.println(list);for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {String temp = iterator.next();System.out.print(temp + "t");if(temp.endsWith("3")) {iterator.remove();}}System.out.println();System.out.println(list);//for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {//String temp = iterator.next();//System.out.print(temp + "t");//if(temp.endsWith("4")) {//list.add("a5");//运行时异常ConcurrentModificationException并发修改异常//}//}//ListIterator是Iterator接口的扩展,用于解决并发修改异常 for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext();) {String temp = iterator.next();System.out.print(temp + "t");if(temp.endsWith("4")) {iterator.add("a5");}}System.out.println();System.out.println(list);}}

运行结果:

注意:

如果遇到遍历容器时,判断删除元素的情况,使用Iterator遍历;如果是判断添加修改元素的情况,使用ListIterator遍历。

3、迭代器遍历Map集合

import java.util.HashMap;import java.util.Iterator;import java.util.Map.Entry;import java.util.Set;public class TestMapItr {public static void main(String[] args) {HashMap<String,Integer> map = new HashMap<String, Integer>();map.put("hello", 123);map.put("world", 456);map.put("java", 789);//方式一Set<String> keySet = map.keySet();for (Iterator<String> iterator = keySet.iterator(); iterator.hasNext();) {String key = iterator.next();System.out.print(key + "=" + map.get(key) + "t");}System.out.println();//方式二Entry<String, Integer>键值关系的类型Set<Entry<String, Integer>> entrySet = map.entrySet();for (Iterator<Entry<String, Integer>> iterator = entrySet.iterator(); iterator.hasNext();) {Entry<String, Integer> entry = iterator.next();System.out.print(entry.getKey() + "--" + entry.getValue() + "t");}System.out.println();}}

运行结果:

我们也可以通过map的keySet()、valueSet()获得key和value的集合,从而遍历它们。

尚学堂百战程序员

百战程序员_IT6000集_影响6000万学习IT的中国人【官网】

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。