Java的List和Map作为入参与clone

代码

    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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值