zoukankan      html  css  js  c++  java
  • java 深浅拷贝 clone

    完全转载,今天在做一个类似于队列的业务,有一个进程不停的读取,写到容器内,另外一个方法循环的将容器内的数据写入到hdfs上面。本来是可以使用队列的,但是想想,运用list也可以实现,

    就不整那么麻烦的东西了! 用到了clone的概念!于是找了下,加深下记忆!

    13.4.2 浅拷贝和深拷贝

    在解释什么是浅拷贝什么是深拷贝前,我们先来看个例子,如代码清单13-10所示。

    代码清13-10 浅拷贝

    1. public class Thing implements Cloneable{
    2. //定义一个私有变量
    3. private ArrayList<String> arrayList = new ArrayList<String>();
    4. @Override
    5. public Thing clone(){
    6. Thing thing=null;
    7. try {
    8. thing = (Thing)super.clone();
    9. } catch (CloneNotSupportedException e) {
    10. e.printStackTrace();
    11. }
    12. return thing;
    13. }
    14. //设置HashMap的值
    15. public void setValue(String value){
    16. this.arrayList.add(value);
    17. }
    18. //取得arrayList的值
    19. public ArrayList<String> getValue(){
    20. return this.arrayList;
    21. }
    22. }

    在Thing类中增加一个私有变量arrayLis,类型为ArrayList,然后通过setValue和getValue分别进行设置和取值,我们来看场景类是如何拷贝的,如代码清单13-11所示。

    代码清13-11 浅拷贝测试

    1. public class Client {
    2. public static void main(String[] args) {
    3. //产生一个对象
    4. Thing thing = new Thing();
    5. //设置一个值
    6. thing.setValue('张三');
    7. //拷贝一个对象
    8. Thing cloneThing = thing.clone();
    9. cloneThing.setValue('李四');
    10. System.out.println(thing.getValue());
    11. }
    12. }

    读者猜想一下运行结果应该是什么?是仅一个'张三'吗?运行结果如下所示。

    1. [张三, 李四]

    怎么会这样呢?怎么会有李四呢?让我来给你解释,是因为Java做了一个偷懒的拷贝动作,Object类提供的方法clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝,确实是非常浅,两个对象共享了一个私有变量,你改我改大家都能改,是一种非常不安全的方式,在实际项目中使用还是比较少的(当然,这是也是一种'危机'环境的一种救命方式)。你可能会比较奇怪,为什么在Mail那个类中就可以使用String类型,而不会产生由浅拷贝带来的问题呢?内部的数组和引用对象才不拷贝,其他的原始类型比如int,long,String(Java就希望你把String认为是基本类型,String是没有clone方法的)等都会被拷贝的。

    注意 使用clone方法拷贝时,满足两个条件的对象才不会被拷贝:一是类的成员变量,而不是方法内的变量;二是必须是一个对象,而不是一个原始类型

    浅拷贝是有风险的,那怎么才能深入的拷贝呢?我们修改一下程序就可以深拷贝,如代码清单13-12所示。

    代码清13-12 深拷贝

    1. public class Thing implements Cloneable{
    2. //定义一个私有变量
    3. private ArrayList<String> arrayList = new ArrayList<String>();
    4. @Override
    5. public Thing clone(){
    6. Thing thing=null;
    7. try {
    8. thing = (Thing)super.clone();
    9. thing.arrayList = (ArrayList<String>) this.arrayList.clone();
    10. } catch (CloneNotSupportedException e) {
    11. e.printStackTrace();
    12. }
    13. return thing;
    14. }
    15. }

  • 相关阅读:
    ajax请求或者页面需要缓存,代码如下
    jquery cookie 删除不了的处理办法
    大家来找茬-SpringMVC中Tomcat正常启动,始终访问不了Controller,出404错
    简单的批量读取外部insert文并插入DB
    关于Jquery.validate.js中动态删除验证remove方法的Bug
    Struts2.3.16.3 基本9个jar包
    CAS SSL证书错误处理
    cas 4.X单点登录实战
    如何高效利用时间
    ubuntu16.04 Detectron目标检测库配置(包含GPU驱动,Cuda,Caffee2等配置梳理)
  • 原文地址:https://www.cnblogs.com/bjanzhuo/p/3575902.html
Copyright © 2011-2022 走看看