2

我有以下 LinkHashMap,

LinkedHashMap<String, ArrayList<String>> test1=new ...

在一个循环中,我像这样分配键值对,

ArrayList<String> temp=new ...
//start iteration
temp.add("some strings")
test1.put("some string", temp);
temp.clear()//temp is cleared for next iteration

这里temp是我之前创建的一个临时列表,并在其中添加了一些内容。但问题是当我清除temp时,传递给test1的temp也被清除,这意味着它是通过引用复制的。如何在 test1 中使用 temp 仍然保持其参考。我知道这是一个基本概念,但我是 Java 新手,并没有了解它的所有功能。

4

4 回答 4

6

那是因为你并没有真正复制List, temp。您正在复制指针(Java 术语中的“引用”)。

这里有两个简单的解决方案:

  1. List将使用new ArrayList<String>(temp)作为您存储在地图中的内容的实际副本。
  2. 与其做temp.clear(),不如做temp = new ArrayList<String>()

第二种选择会表现最好,因为它不会复制任何东西。它只是用新鲜的ArrayList.

于 2012-09-07T02:58:28.420 回答
1

因为LinkedHashMap.put()方法添加了List<T>对象的引用(即单个对象现在被LinkedHashMapArrayList<String>引用引用,并且您可以通过对象引用 -变量或来操作对象)所以不要调用该方法而是创建另一个对象。temptest1.get("some strings")clear()List<T>

ArrayList<String> temp=new ArrayList<String>();
temp.add("some strings")
test1.put("some string", temp);

temp=new ArrayList<String>();
temp.add("foo");
test2.put("another string",temp);
于 2012-09-07T02:57:47.903 回答
1

某人(调用者或被调用者)需要复制 ArrayList 寻址的副本temp,或者您需要为temp. 第二种方法更符合 Java 的“风格”(并且由于被调用者不在您的控制之下,可能是唯一的选择)。

于 2012-09-07T02:57:56.000 回答
1

不要为下一次迭代清除它,只需创建一个新的引用。从列表中删除所有元素可能会成为迭代时的性能问题。

于 2012-09-07T02:59:02.267 回答