我会保持这简短而甜蜜。我正在开发一个涉及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
知道为什么会这样,以及如何解决它?
答案 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"
)都会影响该数组本身。
每次构造并添加一个新数组。