每个键的值都替换为HashMap中最后一个键的值

时间:2015-06-19 12:06:32

标签: java hashmap

我会保持这简短而甜蜜。我正在开发一个涉及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]);

预期产量:Ohyeah
实际输出:FoosaBarsa

知道为什么会这样,以及如何解决它?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

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