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

做问卷调查的网站有啥百度推广费用多少

做问卷调查的网站有啥,百度推广费用多少,用webstorm做静态网站,长春880元网站建设关注:CodingTechWork 引言 在 Java 开发中,对象的拷贝是一个常见的需求,尤其是在处理复杂数据结构时。深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种常见的拷贝方式,它们在实现和…

关注:CodingTechWork

引言

  在 Java 开发中,对象的拷贝是一个常见的需求,尤其是在处理复杂数据结构时。深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种常见的拷贝方式,它们在实现和效果上有着显著的区别。本文将详细介绍深拷贝和浅拷贝的概念、区别,并通过 Java 代码示例进行说明。同时,还会介绍一些常用的深拷贝工具类以及如何自己实现一个深拷贝工具。

深拷贝与浅拷贝的概念

浅拷贝

浅拷贝是指创建一个新对象,然后将当前对象的非静态字段复制到新对象中。如果字段是值类型的(如基本数据类型或不可变对象),那么将复制字段的值;如果字段是引用类型的(如数组、集合、自定义对象等),则复制引用但不复制引用的对象。因此,原始对象和副本对象将引用同一个对象。

深拷贝

深拷贝是指创建一个新对象,然后递归地将当前对象的所有字段(包括值类型和引用类型)复制到新对象中。对于引用类型的字段,深拷贝会创建一个新的对象,并将其复制到副本对象中。因此,原始对象和副本对象是完全独立的,修改一个对象不会影响另一个对象。

深拷贝与浅拷贝的区别

特性浅拷贝深拷贝
值类型字段复制字段的值复制字段的值
引用类型字段复制引用,不复制引用的对象创建新的对象,并复制引用的对象
修改影响修改原始对象可能影响副本对象修改原始对象不会影响副本对象
实现复杂度简单复杂,需要递归
性能较快较慢,尤其是对象结构复杂时

浅拷贝与深拷贝的代码示例

浅拷贝示例

import java.util.Arrays;class Person {private String name;private String[] address;public Person(String name, String[] address) {this.name = name;this.address = address;}public String getName() {return name;}public String[] getAddress() {return address;}// 浅拷贝方法public Person shallowCopy() {return new Person(this.name, this.address);}
}public class ShallowCopyDemo {public static void main(String[] args) {// 创建原始对象Person original = new Person("Alice", new String[]{"123 Main St", "Apt 456"});// 浅拷贝Person shallowCopied = original.shallowCopy();// 修改原始对象的地址original.getAddress()[0] = "456 Elm St";System.out.println("Original Address: " + Arrays.toString(original.getAddress()));System.out.println("Shallow Copied Address: " + Arrays.toString(shallowCopied.getAddress()));}
}

输出:

Original Address: [456 Elm St, Apt 456]
Shallow Copied Address: [456 Elm St, Apt 456]

从输出可以看到,修改原始对象的地址也影响了浅拷贝的对象,因为它们共享同一个地址数组。

深拷贝示例

import java.util.Arrays;class Person {private String name;private String[] address;public Person(String name, String[] address) {this.name = name;this.address = address;}public String getName() {return name;}public String[] getAddress() {return address;}// 深拷贝方法public Person deepCopy() {// 创建新的地址数组String[] newAddress = new String[this.address.length];System.arraycopy(this.address, 0, newAddress, 0, this.address.length);return new Person(this.name, newAddress);}
}public class DeepCopyDemo {public static void main(String[] args) {// 创建原始对象Person original = new Person("Alice", new String[]{"123 Main St", "Apt 456"});// 深拷贝Person deepCopied = original.deepCopy();// 修改原始对象的地址original.getAddress()[0] = "456 Elm St";System.out.println("Original Address: " + Arrays.toString(original.getAddress()));System.out.println("Deep Copied Address: " + Arrays.toString(deepCopied.getAddress()));}
}

输出:

Original Address: [456 Elm St, Apt 456]
Deep Copied Address: [123 Main St, Apt 456]

从输出可以看到,修改原始对象的地址不会影响深拷贝的对象,因为深拷贝创建了一个全新的地址数组。

深拷贝的常用工具类

在 Java 中,有一些常用的工具类可以帮助实现深拷贝,例如 SerializationUtilsJSON 序列化。

使用 SerializationUtils 实现深拷贝

SerializationUtils 是 Apache Commons Lang 提供的工具类,可以利用序列化机制实现深拷贝。以下是示例代码:

import org.apache.commons.lang3.SerializationUtils;import java.io.Serializable;class Person implements Serializable {private String name;private String[] address;public Person(String name, String[] address) {this.name = name;this.address = address;}public String getName() {return name;}public String[] getAddress() {return address;}
}public class SerializationUtilsDemo {public static void main(String[] args) {// 创建原始对象Person original = new Person("Alice", new String[]{"123 Main St", "Apt 456"});// 使用 SerializationUtils 实现深拷贝Person deepCopied = SerializationUtils.clone(original);// 修改原始对象的地址original.getAddress()[0] = "456 Elm St";System.out.println("Original Address: " + Arrays.toString(original.getAddress()));System.out.println("Deep Copied Address: " + Arrays.toString(deepCopied.getAddress()));}
}

输出:

Original Address: [456 Elm St, Apt 456]
Deep Copied Address: [123 Main St, Apt 456]

使用 JSON 序列化实现深拷贝

JSON 序列化是一种常见的深拷贝方式,可以利用 GsonJackson 等库实现。以下是使用 Gson 的示例代码:

import com.google.gson.Gson;class Person {private String name;private String[] address;public Person(String name, String[] address) {this.name = name;this.address = address;}public String getName() {return name;}public String[] getAddress() {return address;}
}public class GsonDemo {public static void main(String[] args) {// 创建原始对象Person original = new Person("Alice", new String[]{"123 Main St", "Apt 456"});// 使用 Gson 实现深拷贝Gson gson = new Gson();String json = gson.toJson(original);Person deepCopied = gson.fromJson(json, Person.class);// 修改原始对象的地址original.getAddress()[0] = "456 Elm St";System.out.println("Original Address: " + Arrays.toString(original.getAddress()));System.out.println("Deep Copied Address: " + Arrays.toString(deepCopied.getAddress()));}
}

输出:

Original Address: [456 Elm St, Apt 456]
Deep Copied Address: [123 Main St, Apt 456]

自己实现深拷贝工具类

如果需要更灵活的深拷贝实现,可以自己编写一个工具类。以下是一个简单的深拷贝工具类的实现:

import java.util.ArrayList;
import java.util.List;public class DeepCopyUtils {public static <T> T deepCopy(T object) {if (object == null) {return null;}// 检查是否是基本数据类型或不可变对象if (object instanceof String || object instanceof Number || object instanceof Boolean) {return object;}// 检查是否是数组if (object.getClass().isArray()) {Object[] array = (Object[]) object;Object[] newArray = new Object[array.length];for (int i = 0; i < array.length; i++) {newArray[i] = deepCopy(array[i]);}return (T) newArray;}// 检查是否是集合if (object instanceof List) {List<Object> list = (List<Object>) object;List<Object> newList = new ArrayList<>();for (Object item : list) {newList.add(deepCopy(item));}return (T) newList;}// 如果是自定义对象,需要手动处理if (object instanceof Person) {Person person = (Person) object;return (T) new Person(person.getName(), deepCopy(person.getAddress()));}throw new IllegalArgumentException("Unsupported type: " + object.getClass().getName());}private static String[] deepCopy(String[] array) {if (array == null) {return null;}String[] newArray = new String[array.length];System.arraycopy(array, 0, newArray, 0, array.length);return newArray;}public static void main(String[] args) {// 创建原始对象Person original = new Person("Alice", new String[]{"123 Main St", "Apt 456"});// 使用自定义工具类实现深拷贝Person deepCopied = DeepCopyUtils.deepCopy(original);// 修改原始对象的地址original.getAddress()[0] = "456 Elm St";System.out.println("Original Address: " + Arrays.toString(original.getAddress()));System.out.println("Deep Copied Address: " + Arrays.toString(deepCopied.getAddress()));}
}

输出:

Original Address: [456 Elm St, Apt 456]
Deep Copied Address: [123 Main St, Apt 456]

总结

概念

  • 浅拷贝:只复制对象的直接字段,对于引用类型字段,复制的是引用而不是对象本身。
  • 深拷贝:递归复制对象的所有字段,包括引用类型字段所指向的对象。

区别

  • 浅拷贝创建的对象与原始对象可能共享引用类型字段所指向的对象,而深拷贝创建的对象与原始对象完全独立。
  • 深拷贝的实现更复杂,性能开销更大,但可以保证对象的完全独立性。

实现方式

  • 浅拷贝:可以通过 Object.clone() 方法或手动实现。
  • 深拷贝:可以通过手动递归实现、利用序列化机制(如 SerializationUtils)、JSON 序列化(如 GsonJackson)或自定义工具类实现。

选择建议

  • 如果对象结构简单,且不需要完全独立的副本,可以选择浅拷贝。
  • 如果需要完全独立的副本,尤其是对象结构复杂时,建议使用深拷贝。
  • 在实际开发中,可以根据具体需求选择合适的实现方式,或者结合多种方式实现更灵活的拷贝逻辑。
http://www.dtcms.com/wzjs/290590.html

相关文章:

  • 常州市网站优化怎样在百度上发布自己的文章
  • 网站建设公司岳阳广告公司名字
  • 深圳做网站(信科网络)成人培训机构
  • 做网站骗南京网页搜索排名提升
  • 怎样做网站公司推广普通话手抄报模板可打印
  • 长春建站价格百度网盘24小时人工电话
  • 先做网站再付款 怎么回答电商产品推广方案
  • 用香港服务器做网站违法吗苏州网络推广seo服务
  • 学做衣服网 缤纷网站营销策划方案范文1500
  • 一个公司做两个网站可以吗深圳seo推广
  • 政府网站英文域名注册营销方案100例
  • 什么做书籍的网站好优质外链
  • 网站 语言选择 中文 英文 源码建网站怎么赚钱
  • 网站分几种郑州搜索引擎优化公司
  • 做海产品的外贸网站互联网推广公司排名
  • 有做软件的网站有哪些百度云登录入口官网
  • 外贸建站行业好做吗百度一下百度主页官网
  • vs做网站加背景江苏网站推广公司
  • 免费安全建网站免费站推广网站在线
  • 国外科技网站欣赏国际免费b站
  • 长春网站运做思路手机系统流畅神器
  • 自己制作wordpress plugin信息流优化师简历
  • 莞城做网站公司b站新人视频怎么推广
  • 如何用java做网站视频优化服务内容
  • 郸城县做网站青岛百度关键词优化
  • 网站蜘蛛来访记录磁力狗最佳搜索引擎
  • 高端企业网站公司阿里云建站费用
  • 佛山网站建设设计公司哪家好免费网站推广软件
  • 网站搭建素材广告多的网站
  • 深圳专业网站建百度浏览器主页网址