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

351e54e4d29e9f9d2983152450a4d4d8.png

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

1、Iterator源码分析

public Iterator<E> iterator() {
    return new Itr();
}

private class Itr implements Iterator<E> {
    int cursor;       // index of next element to return
    int lastRet = -1; // index of last element returned; -1 if no such
    public 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);
	}
}

运行结果:

a5a6dac63d1761d5029d4dc5aa6dd977.png

注意:

如果遇到遍历容器时,判断删除元素的情况,使用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();
	}
}

运行结果:

6843582dd057ce4fad6b065a7e793b2b.png

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

尚学堂百战程序员

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值