【问题标题】:Every key's value is replaced with the value of the last key in my HashMap每个键的值都替换为我的 HashMap 中最后一个键的值
【发布时间】:2015-06-19 12:06:32
【问题描述】:

我会保持简短而甜蜜。我正在做一个涉及 HashMap 嵌套的项目,我遇到了这个问题(简化为一个测试用例):

HashMap options = new HashMap();
HashMap<String,String[]> adMap = new HashMap<String,String[]>();
String[] Test = new String[2];
Test[0] = "Oh";
Test[1] = "yeah";
adMap.put("Test1",Test);
Test[0] = "Foo";
Test[1] = "Bar";
adMap.put("Test2",Test);
Test[0] = "Foosa";
Test[1] = "Barsa";
adMap.put("Test3",Test);
options.put("adList",adMap);
HashMap<String,String[]> adList = (HashMap<String,String[]>)options.get("adList");
String[] ipPort = adList.get("Test1");
System.out.println(ipPort[0]+ipPort[1]);

预期输出:哦耶
实际输出:FoosaBarsa

知道为什么会发生这种情况以及如何解决吗?

【问题讨论】:

  • 您更改了已存储对象中的值,您需要对 Array 对象进行新的引用,如下所示: String[] test = new String[2]; test[0] = ... test[1] = ... put(...,test) test = new String[2]

标签: java hashmap


【解决方案1】:

因为你更新的是Test字符串数组的同一个引用:

Test[0] = "Oh";
Test[1] = "yeah";
adMap.put("Test1",Test);
Test[0] = "Foo";
Test[1] = "Bar";
adMap.put("Test2",Test);
Test[0] = "Foosa";
Test[1] = "Barsa";

您需要在推入地图之前创建新的数组对象。使用此修改进行测试:

String[] Test = new String[2];
Test[0] = "Oh";
Test[1] = "yeah";
adMap.put("Test1",Test);

Test = new String[2];
Test[0] = "Foo";
Test[1] = "Bar";
adMap.put("Test2",Test);

Test = new String[2];
Test[0] = "Foosa";
Test[1] = "Barsa";
adMap.put("Test3",Test);

【讨论】:

    【解决方案2】:

    在 Java 中,数组是对象,因此也有传递的引用。当您将Test 添加到地图时,您所做的任何编辑(例如Test[0] = "Foo")都会影响该数组本身。

    每次构造并添加一个新数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多