java-collection的 iterator 返回的迭代器快速失败

本文介绍了一个使用 Java 中 TreeMap 的示例程序,展示了如何在 TreeMap 中存储 Person 对象,并讨论了在遍历过程中移除元素可能导致的并发修改异常。文章还提供了正确的移除元素的方法。

import java.util.HashMap;  
import java.util.Iterator;  
import java.util.Map;  
import java.util.Set;  
import java.util.TreeMap;  


public class TreeMapTest {  


    public static void main(String[] args) {  
        Map<String,Person> map=new TreeMap<String,Person>();  
        map.put("tom", new Person(16));  
        map.put("jim", new Person(17));  
        map.put("zose", new Person(18));  

        for(Map.Entry<String, Person> entry:map.entrySet()){  
            if(entry.getKey().equals("tom")){  
                map.remove("tom");  
                System.out.println("find tom");  
            }  
            else{  
                System.out.println(entry.getValue().getAge());  
            }  
        }  

        System.out.println(map.size());  
    }  



}  
class Person{  
    int age;  
    public Person(int age){  
        this.age=age;  
    }  
    public int getAge(){  
        return age;  
    }  
}  

collection(由此类所有的“collection 视图方法”返回)的 iterator 方法返回的迭代器都是快速失败 的:在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器自身的 remove 方法,否则在其他任何时间以任何方式进行修改都将导致迭代器抛出 ConcurrentModificationException。因此调用map.remove(“tom”),进入下次循环后,直接抛出ConcurrentModificationException异常,正确答案是:

17
find tom
ConcurrentModificationException

同时,如果要在TreeMap中删除元素,应该采用迭代器的方式

Set<String> set=map.keySet();  
        Iterator<String> it=set.iterator();  
        while(it.hasNext()){  
            String key=it.next();  
            if(key.equals("tom")){  
                it.remove();  
                System.out.println("find tom");  
            }  
            else  
            {  
                System.out.println(map.get(key).getAge());  
            }  
        }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值