1

我有两个 HashMap 定义如下:

HashMap EventTable = new HashMap();
HashMap MainTable = new HashMap ();

现在,假设我在 EventTable 中插入一些数据:

EventTable.put("name", "Test Event Name");

然后,假设我们将 EventTable 插入 MainTable:

MainTable.put("table", EventTable);

然后打印出 MainTable:

{table={name=Test Event Name}}

现在,如果我按如下方式修改事件表:

 EventTable.put("more names", "More test events");

这也会更改 MainTable:

{table={more names=More test events, name=Test Event Name}}

很明显,EventTable 是通过引用 MainTable 来传递的。

我不明白为什么 EventTable 是通过引用传递的。

理想情况下,我想重用 EventTable HashMap 来创建其他条目,同时保留我的旧条目,所以我想按值传递 EventTable。

编辑:

忘记在主要问题中提及这一点,但是当我将字符串添加到 MainTable 时,之后修改字符串时不会改变。那么字符串的行为有什么不同呢?

4

3 回答 3

5

尽管我永远不会使用原始类型并遵循 Java 命名约定,但您可以执行以下操作来获得所需的行为:

mainTable.put("table", new HashMap(eventTable));

解决您的编辑问题:字符串在 Java 中是不可变的。

于 2013-08-06T23:20:40.947 回答
3

正如@assylias 所说,参数按值传递。

这里HashMap不能复制日期,因为它可能是任何东西。但是您可以HashMap通过其构造函数创建一个新的。

HashMap newHashMap= new HashMap(oldHashMap);
于 2013-08-06T23:23:33.130 回答
3

这是因为,即使 Java 按值传递所有参数,当您传递一个对象时,您实际上是在传递一个对象引用。如果你要设置EventTable一个新的 Hashmap,你传入的那个MainTable不会改变。这篇文章可能有助于澄清:http: //javadude.com/articles/passbyvalue.htm

于 2013-08-06T23:29:17.307 回答