我想创建一个链接哈希映射的副本,然后我想删除所有值(从列表中)而不是第一个条目。这是我得到的:

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/

10-10 06:34