我有一个包含一些键(字符串)和值(POJO)的地图
我想遍历此映射并更改POJO中的某些数据。
我继承的当前代码将删除给定的条目,并在对POJO进行一些更改后将其重新添加。
这不能很好地工作,因为在遍历地图时您不应该修改地图(方法已同步,但ConcurrentModificationException仍然出现)
我的问题是,如果我需要遍历地图并更改值,可以使用的最佳实践/方法是什么?要创建一个单独的地图并按需构建,然后返回副本?
两种选择:
我继承的当前代码将删除给定的条目,并在对POJO进行一些更改后将其重新添加。
您是否要更改对POJO 的引用?例如,因此条目完全指向其他内容吗?因为如果没有的话,根本不需要将其从地图中删除,因此只需对其进行更改。
如果确实需要更改对POJO的引用(例如,条目的值),则仍然可以通过Map.Entry
从遍历实例来进行修改entrySet()
。您可以setValue
在条目上使用它,而不会修改您要遍历的内容。
例:
Map<String,String> map;
Map.Entry<String,String> entry;
Iterator<Map.Entry<String,String>> it;
// Create the map
map = new HashMap<String,String>();
map.put("one", "uno");
map.put("two", "due");
map.put("three", "tre");
// Iterate through the entries, changing one of them
it = map.entrySet().iterator();
while (it.hasNext())
{
entry = it.next();
System.out.println("Visiting " + entry.getKey());
if (entry.getKey().equals("two"))
{
System.out.println("Modifying it");
entry.setValue("DUE");
}
}
// Show the result
it = map.entrySet().iterator();
while (it.hasNext())
{
entry = it.next();
System.out.println(entry.getKey() + "=" + entry.getValue());
}
输出(无特定顺序)为:
拜访2对其进行
修改
拜访1
拜访3
2 = DUE
one = uno
three = tre
...没有任何修改例外。如果其他人也正在查看/处理该条目,则可能需要同步该条目。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句