码迷,mamicode.com
首页 > 编程语言 > 详细

Java的List和Map作为入参与clone

时间:2015-07-12 15:50:26      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:clone   java   

代码

    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

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java的List和Map作为入参与clone

标签:clone   java   

原文地址:http://blog.csdn.net/ouyida3/article/details/46849815

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!