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,就连&和&&该用哪个都不知道了:

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

转载请标明出处:

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 ?

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

时间: 2024-10-10 16:18:27

Java的List和Map作为入参与clone的相关文章

java中List、Map、Set、Stack、Queue、Collections等的使用

java中List.Map.Set.Stack.Queue.Collections等的使用 List 创建方法: List<String> list=new ArrayList<>(); add(val) : 添加元素. get(index) : 获取元素. remove(index) : 删除元素. remove(Object o) : 按照元素内容删除 {eg:list.add("marry") ; list.remove(0)==list.remove(&

转!! Java中如何遍历Map对象的4种方法

在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHashMap, Hashtable, 等等) 方法一 在for-each循环中使用entries来遍历 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. [java] view

JAVA中List、Map、Set的区别与选用

类层次关系如下: Collection ├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap └WeakHashMap 下面来分别介绍 Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些 Collection允许相同的元素而另一些不行.一些能排序而另一些不行.Java SDK不提供直接继承自Col

JAVA中,JSON MAP LIST的相互转换

1 JSON包含对象和数组,对应于JAVA中的JSONObject,JSONArray 2 String 转JSON对象 JSONObject.fromObject("String"); String 转JSON数组 JSONArray.fromObject("String"); 3 List 和 JSON互转 JSONObject.toBean() JSONArray.fromObject(List) JAVA中,JSON MAP LIST的相互转换,布布扣,bu

Java里多个Map的性能比较(TreeMap、HashMap、ConcurrentSkipListMap)

问题 比较Java原生的 1.  TreeMap 2.  HashMap 3.  ConcurrentSkipListMap 3种Map的效率. 结果 模拟150W以内海量数据的插入和查找,通过增加和查找两方面的性能测试,结果如下: Map类型 插入 查找(在100W数据量中)   10W 50W 100W 150W 0-1W 0-25W 0-50W ConcurrentSkipListMap 62 ms 227 ms 433 ms 689ms 7 ms 80 ms 119 ms HashMap

JAVA的容器---List,Map,Set的区别

Set 数据是不区分顺序的List 是分先后顺序的ArrayList 是 List的一个实现. arrayList 读快改慢,linkedList 是读慢改快 . 这跟它们的存储有关. ArrayList 顺序开辟空间一个挨着一个.LinkedList是存储人以位置,然后用指针关联 JAVA的容器---List,Map,Set Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├Hash

Java 集合类学习之Map

package com.fish.map; import java.util.HashMap; import java.util.Map; /* 在现实生活中有些数据是以映射关系存在的,也就是成对存在的,比如:  民政局 : 键         值 老公        老婆 ***      人 一把要锁     锁 双列集合: -------------| Map  如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复. ----------

JAVA的容器---List,Map,Set (转)

JAVA的容器---List,Map,Set Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMap Collection是最基本的集合接口,一个Collection代表一组Object,Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List Set,区别在于List是有序的Collecti

Java 集合系列 08 Map架构

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 Java 集合系列 05 Vector详细介绍(源码解析)和使用示例 Java 集合系列 06 Stack详细介绍(源码解析)和使用示例 Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和