当前位置: 首页 > news >正文

wordpress 标签云插件下载宁波seo服务快速推广

wordpress 标签云插件下载,宁波seo服务快速推广,可以做仿牌网站,温州哪里做网站设计一、Java 浅拷贝和深拷贝 在Java中,浅拷贝和深拷贝的主要区别在于对对象的引用和内容的复制方式。 浅拷贝 Java 的类型有基本数据类型和引用类型,基本数据类型是可以由 CPU 直接操作的类型,无论是深拷贝还是浅拷贝,都是会复制出…

 一、Java 浅拷贝和深拷贝

在Java中,浅拷贝和深拷贝的主要区别在于对对象的引用和内容的复制方式。

浅拷贝

        Java 的类型有基本数据类型和引用类型,基本数据类型是可以由 CPU 直接操作的类型,无论是深拷贝还是浅拷贝,都是会复制出另一份。而引用类型仅仅是一个指针,指向的是这个对象在堆内存中分配的内存。

举例: 

class Address {String city;Address(String city) {this.city = city;}
}class Person implements Cloneable {String name;Address address;Person(String name, Address address) {this.name = name;this.address = address;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}public class ShallowCopyExample {public static void main(String[] args) throws CloneNotSupportedException {Address address = new Address("New York");Person person1 = new Person("Alice", address);Person person2 = (Person) person1.clone();// 修改 person2 的地址person2.address.city = "Los Angeles";System.out.println(person1.address.city); // 输出: Los Angeles}
}

        浅拷贝:仅仅是将这个指针拷贝了一份出来,只复制对象的引用,两个指针都指向相同的堆内存地址,原始对象和拷贝对象共享相同的内部对象

深拷贝

举例:

class Address {String city;Address(String city) {this.city = city;}// 深拷贝方法public Address deepCopy() {return new Address(this.city);}
}class Person implements Cloneable {String name;Address address;Person(String name, Address address) {this.name = name;this.address = address;}@Overrideprotected Object clone() throws CloneNotSupportedException {Person cloned = (Person) super.clone();cloned.address = this.address.deepCopy(); // 深拷贝地址return cloned;}
}public class DeepCopyExample {public static void main(String[] args) throws CloneNotSupportedException {Address address = new Address("New York");Person person1 = new Person("Alice", address);Person person2 = (Person) person1.clone();// 修改 person2 的地址person2.address.city = "Los Angeles";System.out.println(person1.address.city); // 输出: New York}
}

        深拷贝:拷贝的就不仅仅是一个指针,还会在堆内存中将原来的对象也拷贝出来一份,原始对象和拷贝对象之间完全独立

        需要注意的一点是:多线程中使用浅拷贝时,多个线程可能会同时修改共享的内部对象,导致数据不一致。这种情况需要通过同步机制(如 synchronized)来避免数据冲突。

当然,深拷贝还常常使用序列化的方式来实现:

import java.io.*;// 可序列化的类
class Address implements Serializable {String city;Address(String city) {this.city = city;}
}class Person implements Serializable {String name;Address address;Person(String name, Address address) {this.name = name;this.address = address;}// 深拷贝方法public Person deepCopy() throws IOException, ClassNotFoundException {// 写入到字节流ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(this);// 从字节流中读取出对象ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return (Person) ois.readObject();}
}public class SerializationDeepCopyExample {public static void main(String[] args) throws IOException, ClassNotFoundException {Address address = new Address("New York");Person person1 = new Person("Alice", address);Person person2 = person1.deepCopy();// 修改 person2 的地址person2.address.city = "Los Angeles";System.out.println(person1.address.city); // 输出: New York}
}

或者单独抽象出一个方法出来实现: 

/***  序列化实现深拷贝:*  这个方法首先将original对象序列化到一个ByteArrayOutputStream中,然后立即使用ByteArrayInputStream从这个字节流中反序列化对象,*  从而得到一个完全独立的深拷贝。这种方法的优点是它相对简单,且能自动处理对象图中的所有复杂关系。然而,它可能比直接使用拷贝构造函数或者克隆方法更慢,*  且只有实现了Serializable接口的对象才能被复制。*/public class DeepCopyViaSerialization {// 实现深拷贝的方法public static <T> T deepCopy ( T original ) {T copied = null;try {// 创建一个字节流ByteArrayOutputStream bos = new ByteArrayOutputStream();// 序列化try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {oos.writeObject(original);}// 反序列化try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()))) {copied = (T) ois.readObject();}} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}return copied;}
}

 

二、JavaScript 浅拷贝和深拷贝

在JavaScript中,浅拷贝和深拷贝是两种复制对象的方式。

浅拷贝

浅拷贝只复制对象的第一层属性,若属性是引用类型(如对象、数组),则复制的是引用。常用方法包括:

  1. Object.assign()

    // Object.assign 缺点: 仅能实现浅拷贝,不适用于深层嵌套对象
    const obj1 = { a: 1, b: { c: 2 } };
    const shallowCopy = Object.assign({}, obj1);
    shallowCopy.b.c = 3;
    console.log(obj1.b.c); // 输出: 3
  2. 扩展运算符

    const obj1 = { a: 1, b: { c: 2 } };
    // 展开运算符(Spread Operator)是 JavaScript 中的一种语法,用于将可迭代对象(如数组或字符串)展开为独立的元素。它使用三个连续的点号(...)作为操作符。
    // 展开运算符可以在多种情况下使用,包括数组、对象和函数调用等。
    const shallowCopy = { ...obj1 };
    shallowCopy.b.c = 3;
    console.log(obj1.b.c); // 输出: 3

深拷贝

深拷贝会递归复制对象及其所有嵌套的属性,确保新对象与原对象完全独立。常用方法包括:

  1. JSON.stringify() 和 JSON.parse()

    const obj1 = { a: 1, b: { c: 2 } };
    const deepCopy = JSON.parse(JSON.stringify(obj1));
    deepCopy.b.c = 3;
    console.log(obj1.b.c); // 输出: 2
  2. 递归函数

    function deepClone(obj) {if (obj === null || typeof obj !== 'object') return obj;const copy = Array.isArray(obj) ? [] : {};for (let key in obj) {copy[key] = deepClone(obj[key]);}return copy;
    }

在JavaScript中,使用浅拷贝和深拷贝的场景各有不同:

使用浅拷贝的场景

  1. 简单数据复制:当对象只包含基本数据类型(如字符串、数字等),可以使用浅拷贝。

    const original = { a: 1, b: 2 }; const copy = { ...original };
  2. 组件状态管理:在React等框架中,更新状态时使用浅拷贝来保持性能。

    setState(prevState => ({ ...prevState, newProp: value }));
  3. 合并对象:合并多个对象时,浅拷贝可以快速实现。

    const merged = Object.assign({}, obj1, obj2);

使用深拷贝的场景

  1. 复杂对象处理:当对象包含嵌套的引用类型,需要独立复制时。

    const deepCopy = JSON.parse(JSON.stringify(complexObj));
  2. 状态管理:在Redux等状态管理库中,深拷贝可以防止状态不小心被修改。

    const newState = deepClone(state);
  3. 数据处理:在处理API返回的复杂数据结构时,确保原始数据不被改变。

    const processedData = deepClone(apiResponse);

总结:

  • 浅拷贝 适合简单对象和性能优化场景。
  • 深拷贝 用于复杂数据结构,确保数据完整性和独立性。

三、总结

  • 浅拷贝:复制对象的引用,对于引用类型的属性会共享内存。
  • 深拷贝:递归复制对象,确保独立性,常用于需要完整复制对象及其嵌套属性的场景。
http://www.mmbaike.com/news/104589.html

相关文章:

  • 上海网络开发公司优化设计七年级下册数学答案
  • 外包 网站开发公司电脑编程培训学校
  • p2p网站开发的流程图seo规则
  • 禅城网站建设多少钱西安seo优化推广
  • 赣州网站建设方案百度学术官网
  • 网站开发公司 经营范围企业网络推广网站
  • 在线微信小程序seo百度快速排名
  • 房产公司网站建设方案ppt短链接在线生成官网
  • 网站建设报价单及项目收费明细表西安自动seo
  • 公司网站访问非法网站的作用seo的方法
  • 12306网站 谁做的优秀营销软文100篇
  • 高端制作网站哪家专业百度信息流投放技巧
  • 呼市建设委员会官方网站百度搜索入口网址
  • 哪些公司适合做线上推广qq关键词排名优化
  • 长沙个人做网站排名seo搜索优化软件
  • dede英文网站it培训机构出来能找到工作吗
  • 网站建设 从用户角度开始网络运营
  • 做垂直网站百度词条优化
  • 网站开发主要做什么武汉百度推广seo
  • 做网站的挣钱么南宁百度seo
  • 网站几几年做的怎么查全网营销推广方式
  • 做公司网站别人能看到吗6平台关键词排名优化
  • 做vi的网站营销宣传策划方案
  • 美食网站建设策划书怎么给公司做网站推广
  • 吉林网站建设费用网络营销策划的概念
  • 个人可以做行业网站吗seo难不难
  • 网站开发可以自学吗郑州搜狗关键词优化顾问
  • 哪个公司可以做网站域名注册哪个平台比较好
  • 提交网站到谷歌seo优化一般多少钱
  • 网页做网站的尺寸长春百度推广公司