import java.util.HashMap;
import java.util.Map;
public class Test1 {
public static void main(String[] args) {
Map map = new HashMap();
Map ma = map;
for (int i = 0; i < 3; i++) {
Map<String, String> map2 = new HashMap<String, String>();
map2.put("sss", "呵呵");
ma.put(i, map2);
ma = map2;
}
System.out.println(map);
System.out.println(ma);
}
}
上面的代码中 没有直接操作map 但是结束后map 得到一个链表值
根据下面的回答想清楚了 最近头有点晕晕的 ma 最开始确实是和map是同一个对象 但是在循环中不停的在改变,每次循环结束后都指向了map2 ,每次循环中map2都是一个新对象,第一次循环中在ma中put进去了一个map,但是在第二次循环的时候 ma就是最先被put进去的map2,所以map的值在不停的改变,得到最后的链表,谢谢下面的各位的回复
Map 创建时,JVM会在Heap区去做New操作,实例名称就是一个指针指向创建好的Map对象内存地址,一开始你让一个名为map的“指针”(实际上Java里面不讲指针这个概念,这里只是一种比喻)指向这个Map,后面你又定义了一个名为ma的“指针”指向同样的Map对象,所以它们俩是一样的内容,因此当你对ma进行put后,map内容也一样会变,因为根本就是同一个对象
map的引用传给了ma,所以map和ma用的是同一个地址,所以在for循环中,往ma里放入数据,map中也同样放入了数据(他们地址相同)
后来,ma又重新赋了map2的引用,所以输出ma时是和map2一样的结果
但是map中的数据的的确确放进去了好几次map2的值,所以map中的数据最多
Map map = new HashMap();
Map ma = map;
这两句你能理解吗?给你换一种写法
Dog 小泉 = new Dog();
Dog 松下 = 小泉;
Dog 小泉 = new Dog();这句创建了一个对象,相当于你造了一条狗,然后你管它叫小泉
Dog 松下 = 小泉;这句的意思,你给小泉又起了一个名字叫松下,所以以后你不管叫小泉还是叫松下,都指的这条狗
你让小泉吃一坨便便,那松下肚子里就有便便,你砍了松下一条腿,那小泉就缺了一条腿,明白??
Map ma = map;你把map赋值给了ma, 所以输出肯定就是map的东西啊。