首页 > 其他分享 >深拷贝,浅拷贝

深拷贝,浅拷贝

时间:2023-06-04 16:34:50浏览次数:36  
标签:p1 String num address 拷贝 public name

浅拷贝:只拷贝基本类型的属性,引用类型的属性将地址付给新对象,所以浅拷贝后修改基本类型属性两个对象不会影响,修改引用类型属性会互相影响.浅拷贝可以用cloneable接口的clone方法实现,也可以用spring的 BeanUtils.copyProperties方法实现

深拷贝:基本类型和引用类型的属性都是真正的拷贝,所以深拷贝后修改基本类型和引用类型的属性都不会互相影响

浅拷贝实现代码:

package kun.copy;

public class Address {

    String address;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Address{" +
                "address='" + address + '\'' +
                '}';
    }
}
package kun.copy;

public class Person implements  Cloneable{
 
     int num;
     String name;
     Address address;
 
    public Person() {
    }
 
    public Person(int num, String name) {
        this.num = num;
        this.name = name;
    }
 
    public int getNum() {
        return num;
    }
 
    public void setNum(int num) {
        this.num = num;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Address getAddress() {
        return address;
    }
 
    public void setAddress(Address address) {
        this.address = address;
    }
 
    @Override
    protected Person clone() throws CloneNotSupportedException {
        Person person = (Person)super.clone();
        return person;
    }
 
    @Override
    public String toString() {
        return "Person{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", address=" + address +
                '}';
    }
}

 

package kun.copy;

import org.springframework.beans.BeanUtils;

public class Test {
 
    public static void main(String[] args) throws CloneNotSupportedException {
        //测试浅拷贝
        Address address = new Address();
        address.setAddress("汉中");
        Person p1 = new Person(100, "jim");
        p1.setAddress(address);
        Person p2 = p1.clone();
        p1.setNum(99);//修改p1对象中基本类型属性,不会影响p2
        p2.setName("tom");//修改p2对象中基本类型属性,不会影响p1
        p1.getAddress().setAddress("西安"); //浅拷贝不复制引用类型属性,只是将地址赋给新对象,所以修改p1中引用属性的值会影响p2
        System.out.println(p1); // 99 jim   西安
        System.out.println(p2);// 100 tom    西安
    }
}
package kun.copy;

import org.springframework.beans.BeanUtils;

public class TestBeanUtil {
 
    public static void main(String[] args) throws CloneNotSupportedException {
//spring的 BeanUtils.copyProperties的浅拷贝
        Address address = new Address();
        address.setAddress("汉中");
        Person p1 = new Person(100, "jim");
        p1.setAddress(address);
        Person p2 = p1.clone();
        p1.setNum(99);//修改p1对象中基本类型属性,不会影响p2
        p2.setName("tom");//修改p2对象中基本类型属性,不会影响p1
        p1.getAddress().setAddress("西安"); //浅拷贝不复制引用类型属性,只是将地址赋给新对象,所以修改p1中引用属性的值会影响p2
        System.out.println(p1); // 99 jim   西安
        System.out.println(p2);// 100 tom    西安
    }
}

深拷贝实现代码:

package kun.copy;

import java.io.Serializable;

public class Address2 implements Serializable {
 
     String  address;
 
    public String getAddress() {
        return address;
    }
 
    public void setAddress(String address) {
        this.address = address;
    }
 
    @Override
    public String toString() {
        return "Address{" +
                "address='" + address + '\'' +
                '}';
    }
 
}
package kun.copy;

import java.io.*;

public class Person2 implements Serializable {
 
     int num;
     String name;
     Address2 address;
 
    public Person2() {
    }
 
    public Person2(int num, String name) {
        this.num = num;
        this.name = name;
    }
 
    public int getNum() {
        return num;
    }
 
    public void setNum(int num) {
        this.num = num;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }

    public Address2 getAddress() {
        return address;
    }

    public void setAddress(Address2 address) {
        this.address = address;
    }

    /**
     * 自定义克隆方法
     * @return
     */
    public Person2 myclone() {
            Person2 person2 = null;
              try { // 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
                     ByteArrayOutputStream baos = new ByteArrayOutputStream();
                      ObjectOutputStream oos = new ObjectOutputStream(baos);
                      oos.writeObject(this);
            // 将流序列化成对象
                    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
                     ObjectInputStream ois = new ObjectInputStream(bais);
                     person2 = (Person2) ois.readObject();
                  } catch (IOException e) {
                     e.printStackTrace();
                  } catch (ClassNotFoundException e) {
                     e.printStackTrace();
                 }
             return person2;
          }
 
 
    @Override
    public String toString() {
        return "Person{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", address=" + address +
                '}';
    }
}
package kun.copy;

import kun.copy.Person;

public class TestDeepCopy {
 
    public static void main(String[] args) throws CloneNotSupportedException {

        Address2 address = new Address2();
        address.setAddress("汉中");

        Person2 p1 = new Person2(100, "jim");
        p1.setAddress(address);

        Person2 p2 = p1.myclone();
        p1.setNum(99);
        p2.setName("tom");
        p2.getAddress().setAddress("西安");//深拷贝中将引用类型属性也实现真正的拷贝,所以修改p2的引用属性不会影响p1

        System.out.println(p1); // 99,jim 汉中
        System.out.println(p2); // 100,tom 西安
    }
}

 

标签:p1,String,num,address,拷贝,public,name
From: https://www.cnblogs.com/1--2/p/17455849.html

相关文章

  • 深入剖析Linux IO原理和几种零拷贝机制的实现
    https://www.cnblogs.com/lsgxeva/p/11619464.html来源 https://zhuanlan.zhihu.com/p/83398714零壹技术栈   公众号【零壹技术栈】前言零拷贝(Zero-copy)技术指在计算机执行操作时,CPU不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切......
  • 还在用BeanUtils拷贝对象?MapStruct才是王者!【附源码】
    前几天,远在北京的小伙伴在群里抛出了“MapStruct”的概念。对于只闻其名,未见其人的我来说,决定对其研究一番。本文我们就从MapStruct的概念出发,通过具体的代码示例来研究它的使用情况,最后与“市面上”的其它工具来做个对比!官方介绍首先我们打开MapStruct的官网地址,映入眼帘的就......
  • C++中分别使用左值形参和右值形参的拷贝构造和移动构造
    #include<iostream>classData{public:Data(){std::cout<<"EMPTY."<<std::endl;}Data(constData&d){std::cout<<"lvaluecopy."<<std::endl;}Data(constData&&d){std::cout......
  • 还在用BeanUtils拷贝对象,MapStruct才是yyds | 附源码
    前几天,远在北京的小伙伴在群里抛出了“MapStruct”的概念。对于只闻其名,未见其人的我来说,决定对其研究一番。本文我们就从MapStruct的概念出发,通过具体的代码示例来研究它的使用情况,最后与“市面上”的其它工具来做个对比!官方介绍首先我们打开MapStruct的官网地址,映入眼帘的就......
  • Js 常见数据类型及判断方法及手写深拷贝
    常见值类型:undefined、String、Number、boolean、Symbol.常见 引用类型:Array、Object、function(特殊引用类型,单不用于存储数据,所以 “没有拷贝、复制函数” 这说法)、null(特殊引用类型,指针指向为空地址)判断数据类型的方法:typeof运算符leta;conststring='abc......
  • python numpy 深拷贝 浅拷贝
    importnumpyasnpimportcopya=np.mat("123;456;789")print(a)b=ab[0,0]=0print(a)print(b)print("-"*10)输出结果[[123][456][789]][[023][456][789]][[023][456][789]]----------可以看到直接赋值时改变b同时......
  • 编译器绕过拷贝构造函数和返回值优化
    写在前面:在拷贝初始化(也就是用等号初始化,注意使用拷贝构造函数创建一个新的对象不属于拷贝初始化)过程中,编译器可以(但不是必须)跳过拷贝构造函数或者移动构造函数,直接创建对象。1stringnull_book="999";2//可以改写为3stringnull_book("999");这里面”999“隐式的转换为......
  • java根据文件IO流实现文件拷贝
    代码实现如下1/**2*作用:执行文件夹文件拷贝3*@authorqi4*@paramcopyFile5*@paramcopyToFile6*@returnvoid7**/8publicstaticvoidcopyDir(FilecopyFile,FilecopyToFile)throwsIOException{9......
  • jquery 拷贝对象
    如果想要把某个对象拷贝(合并)给另外一个对象使用,此时可以使用$.extend()方法语法∶$.extend([deep],target,object1,[object])1.deep:如果设为true为深拷贝,默认为false浅拷贝2.target:要拷贝的目标对象3.object1:待拷贝到第一个对象的对象。案例:<!DOCTYPEhtml><htmllang=......
  • 深拷贝的实现
    JavaScript深拷贝的实现;这里记录一下手写递归的方式实现深拷贝创建克隆函数functioncloneDeep(obj){}函数内创建一个变量;用来接数据letnewObj=null判断传入的参数是不是引用数据类型;并且不是空的;满足的条件执行if内的语句if(typeofobj==='obje......