繁体   English   中英

HashMap-不获取异常输出

[英]HashMap - Doesnot get excepted output

我有以下2种情况:

情况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我没有得到我所排除的输出吗?

您使用的是相同的哈希图,因此必须创建它的新实例。

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); 

mainMap中的值是对HashMap对象的引用 对该对象的任何引用(例如subMap )都可以更改它。

如果您感到困惑,这可能会有所帮助:

该行将创建一个HashMap对象,并为其分配一个subMap引用。 HashMap subMap = new HashMap();

子图--------> [hashObject]

该行将添加“ one”作为键,并将subMap“ reference”作为值mainMap.put(“ one”,subMap);

因此,mainMap.put(“ one”,subMap --------------------- [hashObject]

然后打印分配给键“ one”的值,即{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对象,不会创建新对象,并且“一个”和“两个”都具有值,该引用引用了同一对象。

请注意,这不是原始对象。

int a = 10;
int b = a;
a++;

输出:

a=11

b=10

但如果是对象,则其引用不是对象,

Object a = new Object();

Object b = a;

使用这些引用中的任何一个所做的任何更改都会影响同一个对象,因为两者都引用同一个对象。

在您的情况2中,您首先打印了地图,然后添加了下一个键值。

HashMap不保证存储在其中的项目的特定顺序。 它是无序的。

请改用LinkedHashMap 它按插入顺序存储项目。

阅读Java文档以获取更多信息:

http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM