我有以下两种情况:
案例1:
HashMap<String, HashMap<String,String>> mainMap = new HashMap<String, HashMap<String,String>>();
HashMap <String, String> subMap = new HashMap<String,String>();
subMap.put("11", "12");
subMap.put("13", "124");
subMap.put("21", "122");
subMap.put("14", "152");
System.out.println("For One : "+subMap);
mainMap.put("one", subMap);
subMap.put("15", "152");
subMap.put("17", "152");
System.out.println("For Two : "+subMap);
mainMap.put("two", subMap);
System.out.println(mainMap);
我将输出除外:
For One : {21=122, 13=124, 14=152, 11=12}
For Two : {21=122, 17=152, 15=152, 13=124, 14=152, 11=12}
{two={21=122, 17=152, 15=152, 13=124, 14=152, 11=12}, one={21=122, 13=124, 14=152, 11=12}}
但我得到了输出:
For One : {21=122, 13=124, 14=152, 11=12}
For Two : {21=122, 17=152, 15=152, 13=124, 14=152, 11=12}
{two={21=122, 17=152, 15=152, 13=124, 14=152, 11=12}, one={21=122, 17=152, 15=152, 13=124, 14=152, 11=12}}
为什么?
案例2:
我也尝试过:
HashMap<String,String> map12 = new HashMap<String, String>();
map12.put("1","1234");
map12.put("2","1234");
System.out.println("map12 : "+map12);
map12.put("3","1234");
我得到的输出除外:
map12 : {2=1234, 1=1234}
可以解释为什么在case1
我没有得到输出,因为我除外?
答案 0 :(得分:1)
您正在使用相同的散列图,您必须创建它的新实例。
HashMap<String, HashMap<String,String>> mainMap = new HashMap<String, HashMap<String,String>>();
HashMap <String, String> subMap = new HashMap<String,String>();
subMap.put("11", "12");
subMap.put("13", "124");
subMap.put("21", "122");
subMap.put("14", "152");
System.out.println("For One : "+subMap);
mainMap.put("one", subMap);
subMap = new HashMap<String,String>(); /// <<<<<<<<
subMap.put("21", "122");
subMap.put("17", "152");
subMap.put("15", "152");
subMap.put("13", "124");
subMap.put("14", "152");
subMap.put("11", "12");
System.out.println("For Two : "+subMap);
mainMap.put("two", subMap);
System.out.println(mainMap);
答案 1 :(得分:1)
mainMap 中的值是HashMap对象的引用。对该对象的任何引用(例如 subMap )都可以更改它。
答案 2 :(得分:0)
如果您感到困惑,这可能有所帮助:
该行将创建一个HashMap对象,并为其分配一个subMap引用。 HashMap subMap = new HashMap();
子地图--------&GT; [hashObject]
此行将添加&#34; one&#34;作为关键,subMap&#34;参考&#34;作为价值 mainMap.put(&#34; one&#34;,subMap);
所以, mainMap.put(&#34; one&#34;,subMap ---------------&gt; [hashObject]
然后你将值分配给键&#34;一个&#34;即{21 = 122,13 = 124,14 = 152,11 = 12}
现在,您将值放在同一个HashMap对象[hashObject]
中subMap.put("15", "152");
subMap.put("17", "152");
现在,地图包含
{21=122, 17=152, 15=152, 13=124, 14=152, 11=12}
然后,您将其指定为:
mainMap.put("two", subMap---------------> [hashObject]
试试这个:
System.out.println("For One : "+subMap);
System.out.println("For Two : "+subMap);
输出:
For One : {11=12, 13=124, 14=152, 15=152, 17=152, 21=122}
For Two : {11=12, 13=124, 14=152, 15=152, 17=152, 21=122}
这是一个相同的HashMap对象,没有创建新对象,而且&#34; one&#34;和&#34;两个&#34;有价值,是指同一个对象的参考。
请注意,这是一个不是原始的对象。
int a = 10;
int b = a;
a++;
输出:
a=11
b=10
但是如果对象的引用不是对象,
Object a = new Object();
Object b = a;
使用任何这些引用完成的任何更改都将影响同一个对象,因为两者都是 引用同一个对象。
在你的情况2中,你首先打印地图,然后添加下一个键值。
答案 3 :(得分:-1)
HashMap
不保证存储在其中的商品的特定订单。这是无序的。
请改用LinkedHashMap
。它按照插入它们的顺序存储项目。
阅读Java Docs以获取更多信息:
http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html