我想创建一个链接哈希映射的副本,然后我想删除所有值(从列表中)而不是第一个条目。这是我得到的:
LinkedHashMap<String, List<Value>> facetsInCategoriesCopy = new LinkedHashMap<>(facetsInCategories);
if (!facets.equals("something")) {
for (List<Value> value : facetsInCategoriesCopy.values()) {
if (value.size() > 1) {
int nbrOfElements = value.size();
for (int i = nbrOfElements-1; i > 0; i--) {
value.remove(i);
}
}
}
}
经过此操作后,事实证明facetsInCategories也被修改了。为什么?以及如何解决这个问题?
任何帮助,将不胜感激。
最佳答案
我没有50的声誉来添加评论。查看此答案Assigning Hashmap to Hashmap
本质上,用于制作新映射的副本构造函数具有对可变对象的引用,即facetsInCategories
,并且在更新facetsInCategoriesCopy
映射时也会对其进行更新。
解决方案是改为进行深层复制。我在下面添加了测试代码,我使用了String
而不是Value
//Test for https://stackoverflow.com/questions/27324315/
public static void testStackO_Q_27324315() {
Map<String, List<String>> facetsInCategories = new LinkedHashMap<String, List<String>>();
String[] values = new String[]{"Test1", "Test2", "Test3"};
List<String> valuesList = new ArrayList<String>(Arrays.asList(values));
facetsInCategories.put("Test", valuesList);
Map temp = Collections.unmodifiableMap(facetsInCategories);
LinkedHashMap<String, List<String>> facetsInCategoriesCopy = (LinkedHashMap<String, List<String>>)deepCopy(temp);
String facets = "test_me";
if (!facets.equals("something")) {
for (List<String> value : facetsInCategoriesCopy.values()) {
if (value.size() > 1) {
int nbrOfElements = value.size();
for (int i = nbrOfElements-1; i > 0; i--) {
value.remove(i);
}
}
}
}
System.out.println(facetsInCategories);
System.out.println(facetsInCategoriesCopy);
}
public static <K1, K2, V> Map<K1, List<V>> deepCopy(
Map<K1, List<V>> original){
Map<K1, List<V>> copy = new LinkedHashMap<K1, List<V>>();
for(Map.Entry<K1, List<V>> entry : original.entrySet()){
copy.put(entry.getKey(), new ArrayList<V>(entry.getValue()));
}
return copy;
}
关于java - Java:LinkedHashMap自身重叠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27324315/