[英]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.