HashMap - 没有得到预期的输出

时间:2014-05-14 17:55:27

标签: java map hashmap

我有以下两种情况:

案例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我没有得到输出,因为我除外?

4 个答案:

答案 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