关于Map.entrySet()的疑惑

本文通过一个具体的案例探讨了在Java中使用Map.entrySet()时可能遇到的问题,特别是当尝试遍历并强制转换其中的元素时可能会引发ClassCastException异常的情况。
前几天项目用到Map,接着调用Map.entrySet(),结果产生了一些意外的后果.
就是,持久化数据数据的时候出现setter of com.hiber.Hibernate.Test.id 异常.
此异常是提醒,pojo里面未有属性的getter.
因为我在其他方法里面保存过,未曾出现异常,觉得甚是奇怪.后来发现,原来是Map.entrySet()搞的鬼,根据java api.
返回此映射中包含的映射关系的 set 视图。返回的 set 中的每个元素都是一个 Map.Entry。该 set 受映射支持,所以对映射的改变可在此 set 中反映出来,反之亦然。如果修改映射的同时正在对该 set 进行迭代(除了通过迭代器自己的 remove 操作,或者通过在迭代器返回的映射项上执行 setValue 操作外),则迭代结果是不明确的。set 支持通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作实现元素移除,即从映射中移除相应的映射关系。它不支持 add 或 addAll 操作。
为此,我写了一个测试代码.
[code]
public class TestMap {

/**
* @param args
*/
public static void main(String[] args) {
Map test = new HashMap();

//测试,put进TestObject
for(int i=0; i<5; i++){
TestObject to = new TestObject();
test.put(new Integer(i), to);
}

//输出,这里进行类型强制转换,出现java.lang.ClassCastException.
for(Iterator it = test.entrySet().iterator(); it.hasNext();){

TestObjectt = (TestObject)it.next();
t.toString();
//System.out.println(t.);
}

//输出,这里直接转换成Object,并且输出的是自己定义的toString()
//且可以正常输出,为此,我不理解.为什么转换的时候保存.
//估计是里面做了些什么手脚.
for(Iterator it = test.entrySet().iterator(); it.hasNext();){

TestObjectt = (TestObject)it.next();
t.toString();
//System.out.println(t.);
}

}


}

class TestObject{
public String toString(){
System.out.println("TestObject");
return null;
}
}

[/code]
`Map.entrySet()` 是 Java 中 `Map` 接口提供的一个方法,用于返回包含映射关系的 `Set` 视图[^1]。`Map.Entry` 是 `Map` 声明的一个内部接口,代表 `Map` 中的键值对实体 `Entry(key, values)`,`Map` 的 `entrySet()` 方法会返回键值对实体对的集合,此集合的类型即为 `Map.Entry`,在 `Map.Entry` 接口中有 `getKey()` 和 `getValue()` 方法用于获取键和值[^3]。 以下是使用 `Map.entrySet()` 方法的示例: ```java import java.util.HashMap; import java.util.Map; public class EntrySetExample { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "value1"); map.put(2, "value2"); map.put(3, "value3"); map.put(4, "value4"); map.put(5, "value5"); // 使用 for-each 循环遍历 entrySet for (Map.Entry<Integer, String> entry : map.entrySet()) { System.out.println("key: " + entry.getKey() + " value: " + entry.getValue()); } System.out.println(); // 使用迭代器遍历 entrySet java.util.Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<Integer, String> entry = iterator.next(); System.out.println("key: " + entry.getKey() + " value: " + entry.getValue()); } System.out.println(); // 使用 Java 8 的 forEach 和 Lambda 表达式遍历 entrySet map.entrySet().forEach(entry -> { System.out.println("key: " + entry.getKey() + " value: " + entry.getValue()); }); } } ``` 上述代码展示了三种使用 `Map.entrySet()` 遍历 `Map` 的方式:使用 `for-each` 循环、使用迭代器和使用 Java 8 的 `forEach` 方法结合 Lambda 表达式。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值