Java的List和Map作为入参与clone

来源:互联网 发布:淘宝网韩版卫衣 编辑:程序博客网 时间:2024/04/30 09:03

代码

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

答案

  1. 2
  2. 2、2、3
  3. 2

原因

list作为入参,传的其实是引用。那进入方法里修改的也是该引用。
要解决这个问题,有两个方法。一个是使用clone,一个是new一个新的对象1。然后把修改后的list作为出参return回去,这样才不影响入参。
需要注意的是List和Map都是接口,是没有clone的。ArrayList和HashMap才有clone,而且是浅拷贝,而不是深拷贝2。

ps:以前对Map烂熟,现在啥都不记得了。两年没怎么写Java,就连&和&&该用哪个都不知道了:

永远不要离代码太远。不然,你离技术也越来越远了。

转载请标明出处:
本文出自:【ouyida3的博客】
2015.7.12


  1. 传值与传址参考:
    http://www.blogjava.net/junglesong/archive/2008/02/22/181246.html ↩
  2. 深复制与浅复制网上大把的资料:
    http://www.cnblogs.com/yxnchinahlj/archive/2010/09/20/1831615.html ↩
0 0
原创粉丝点击