TreeMap的快速失败(支付宝笔试题)

本文介绍了在支付宝笔试中遇到的一道关于TreeMap的问题。题目涉及到TreeMap的排序特性以及在遍历过程中进行修改时的快速失败机制。当使用迭代器之外的方式修改Map时,迭代器会抛出`ConcurrentModificationException`。因此,建议在删除TreeMap元素时使用迭代器。
摘要由CSDN通过智能技术生成

前几天面试支付宝,有个基础笔试题,都做错了,题目如下

package com.yf.test;


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;
	}
}

要求写出程序输出,

该题目本人仅知道TreeMap是基于key排序的,平时也比较少用treemap,了解也比较少,不知道其中还有什么玄机,所以答案直接写的

17

find tom

18
2

然后此处还需要注意的是: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());
			}
		}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值