以下程序维护名为:
的2个数据结构map of type HashMap
map_1 also of type HashMap
在开头map
填充key : 1
和value : suhail
。然后,使用键map_1
将此地图插入20
。
map
再次填充key : 1
和另一个value : CSE
。此地图再次插入map_1
。
import java.util.*;
class KeyTest {
public static void main(String args[]) {
Map<Integer,String> map = new HashMap<Integer,String>();
Map<Integer,Object> map_1 = new HashMap<Integer,Object>();
map.put(1,"suhail");
map_1.put(20,map);
map.put(1,"CSE");
map_1.put(21,map);
Set<Integer> keys = map_1.keySet();
Iterator i = keys.iterator();
while(i.hasNext()) {
System.out.println(map_1.get((Integer)i.next()));
}
}
}
当我打印map_1
值时,这就是我得到的:
{1=CSE}
{1=CSE}
但这不是我所期待的。根据我的说法,程序应该如何运行:
[1,suhail]--> map
[20,[1,suhail]]---> map_1
[1,CSE]--> map (A replace, because of the same keys)
[21,[1,CSE]]--->map_1
所以输出应该是:
[1,suhail]
[1,CSE]
任何人都可以解释一下,为什么我没有得到这个输出
答案 0 :(得分:4)
将对象map
插入map_1
时,不会复制它。当您在map_1
之外修改它时,也会修改存储的对象,因为它是同一个对象。
将新地图重新分配给map
以解决此问题:
Map<Integer,Object> map_1 = new HashMap<Integer,Object>();
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1,"suhail");
// The first "map" object gets inserted
map_1.put(20,map);
// Make a new object
map = new HashMap<Integer,String>();
map.put(1,"CSE");
// Now the second object gets inserted
map_1.put(21,map);
答案 1 :(得分:0)
在地图中,您可以为一个value
设置一个key
,这样如果您再次将某些内容放在将被新对象替换的相同键上。因此,当您在key:1
上再次放置某些内容时,该值将被替换。您必须创建一个新对象来绕过该行为意味着新地图。
并且您已将map ref放在map1中,因此在编辑它时,其内部副本也会被修改。
答案 2 :(得分:0)
那是因为你要覆盖同一个Map实例中的最后一个值。
map <- [1: "suhail"]
map_1 <- [20: [1: "suhail"]]
map <- 1, 'CSE' (you lost "suhail", overwriting key 1) [1: "CSE"]
map_1 <- 21, map, same object in two different keys. [20: [1: "CSE"], 21: [1: "CSE"]]
在这种情况下,您在map_1
中拥有与两个不同键相关的相同实例。
要做你想做的事,你必须为map
创建一个新的Map实例。
import java.util.*;
class KeyTest {
public static void main(String args[]) {
Map<Integer,String> map = new HashMap<Integer,String>();
Map<Integer,Object> map_1 = new HashMap<Integer,Object>();
map.put(1,"suhail");
map_1.put(20,map);
map = new HashMap<Integer,String>();
map.put(1,"CSE");
map_1.put(21,map);
Set<Integer> keys = map_1.keySet();
Iterator i = keys.iterator();
while(i.hasNext()) {
System.out.println(map_1.get((Integer)i.next()));
}
}
}
答案 3 :(得分:0)
输出正确,在下面的陈述中
map.put(1,"suhail");
//--> map has [1 = suhail]
map_1.put(20,map);
//--> map1 has [20 = [1 = suhail]]
map.put(1,"CSE");
//--> You are modifying the same map reference, hence now map is [1 = "CSE"]
map_1.put(21,map);
//--> you are putting the same map ref to map1 with new key so map1 is [20 = [1 = "CSE"], [21 = [1 = "CSE"]]
由于您使用的是相同的 map
对象,因此输出就是这样。如果您要创建新的map
,则可能需要为HashMap
map
引用新的{{1}}
您只打印值,因此输出
答案 4 :(得分:0)
这是因为您在地图中存储了对象的引用,而不是它的值。 在map_1中,键20和21都链接到同一个对象(地图)。 如果您希望它们不同(例如在循环中),则必须为每个键创建一个新的地图对象。
顺便说一句,你只是打印值,而不是键,这就是为什么20和21没有显示在你的输出中(假设这是问题的一部分,当然)
这是希望它有所帮助。