代码
public static void main(String[] args) {
testList();
}
/**
* 测试HashMap是否需要clone
*
* 1、你觉得,print出来的id是1还是2呢?
* 2、list的size是1还是2呢?每一个的map的id是1还是2?
* 3、id会不会是4呢?
*
* @since 2015.7.12
*/
private static void testList() {
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map = new HashMap<String, String>();
map.put("id", "1");
list.add(map);
testMap(list);
System.out.println("1、=========== id=" + list.get(0).get("id"));
testMap2(list);
System.out.println("2、=========== size=" + list.size());
System.out.println("id="+list.get(0).get("id"));
System.out.println("id="+list.get(1).get("id"));
testMap3(list);
System.out.println("3、=========== id=" + list.get(0).get("id"));
}
private static void testMap(List<Map<String, String>> list) {
Map<String, String> map = list.get(0);
map.put("id", "2");
}
private static void testMap2(List<Map<String, String>> list) {
Map<String, String> map = list.get(0);
map = new HashMap<String, String>();
map.put("id", "3");
list.add(map);
}
private static void testMap3(List<Map<String, String>> list) {
Map<String, String> map = (Map<String, String>) ((HashMap<String, String>) list.get(0)).clone();
map.put("id", "4");
}
答案
- 2
- 2、2、3
- 2
原因
list作为入参,传的其实是引用。那进入方法里修改的也是该引用。
要解决这个问题,有两个方法。一个是使用clone,一个是new一个新的对象1。然后把修改后的list作为出参return回去,这样才不影响入参。
需要注意的是List和Map都是接口,是没有clone的。ArrayList和HashMap才有clone,而且是浅拷贝,而不是深拷贝2。
ps:以前对Map烂熟,现在啥都不记得了。两年没怎么写Java,就连&和&&该用哪个都不知道了:
永远不要离代码太远。不然,你离技术也越来越远了。
转载请标明出处:
2015.7.12
- 传值与传址参考:
http://www.blogjava.net/junglesong/archive/2008/02/22/181246.html ?
- 深复制与浅复制网上大把的资料:
http://www.cnblogs.com/yxnchinahlj/archive/2010/09/20/1831615.html ?
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-10 16:18:27