为什么将此HashMap作为参考传递

时间:2013-08-06 23:17:05

标签: java hashmap

我有两个HashMaps定义如下:

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添加一个String时,我在之后修改字符串时不会改变。那么String的行为有何不同?

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

在@assylias中说,参数通过值传递。

此处HashMap无法复制日期,因为它可能是任何内容。但您可以通过其构造函数创建新的HashMap

HashMap newHashMap= new HashMap(oldHashMap);

答案 2 :(得分:2)

这是因为,即使Java按值传递所有参数,当您传递对象时,您实际上是在传递对象引用。如果您要将EventTable设置为新的Hashmap,则不会更改传递给MainTable的Hashmap。本文可能有助于澄清问题:http://javadude.com/articles/passbyvalue.htm