您的位置:首页 > 其它

由Map的复制问题引发对深复制和浅复制的思考

2015-02-04 17:50 155 查看
前几天写程序遇到了这样的一个问题:

[java] view
plaincopy

Map<String, Object> args=getparameters();  

  

Map<String, Object> hot_args=args;  

hot_args.put("sortItem","pv");  

  

Map<String, Object> common_args=args;  

common_args.put("dateId","week");  

         一直有问题,后来才发现,common_args的sortItem键值和hot_args的键值是一致的,并且在最后,args,hot_args,common_args都是一样的,考虑一番,才想起来这是由于深复制和浅复制的问题:
所谓浅复制:则是只复制对象的引用,两个引用仍然指向同一个对象,在内存中占用同一块内存。被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深复制:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
下面是我写的一个实现深复制的案例:(实现对POJO对象的深复制)
User.java

[java] view
plaincopy

package text.copy;  

  

public class User implements Cloneable  {  

    private String name;  

    private String passwd;  

    public String getName() {  

        return name;  

    }  

    public void setName(String name) {  

        this.name = name;  

    }  

    public String getPasswd() {  

        return passwd;  

    }  

    public void setPasswd(String passwd) {  

        this.passwd = passwd;  

    }  

    public Object clone()//重写Cloneable接口的clone()方法  

    {  

        User user=null;  

        try{  

            user=(User)super.clone();//将一个实例克隆,并抛出异常  

        }catch(CloneNotSupportedException e)  

        {  

            e.printStackTrace();  

        }  

        return user;  

    }  

}  

使用:

[java] view
plaincopy

User user1=new User();  

user1.setName("Lily");  

User user2=(User)user1.clone();  

user2.setName("admin");  

System.out.println("user1.name:"+user1.getName());  

System.out.println("user2.name:"+user2.getName());  

结果:

[java] view
plaincopy

user1.name:Lily  

user2.name:admin  

回到最上面,对于Map,我们不好去重写Map类或者HashMap类,但可以通过另外一种方式,HashMap的putAll()来实现:

[java] view
plaincopy

Map<String, Object> args=getparameters();  

  

Map<String, Object> hot_args=new HashMap<String, Object>();  

hot_args.putAll(_args);  

hot_args.put("sortItem","pv");  

  

Map<String, Object> common_args=new HashMap<String, Object>();  

common_args.putAll(_args);  

common_args.put("dateId","week");  

这样,每次都重新创建一个HashMap对象,在改对象上添加键值,三者互不干扰。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: