Java 基础教程

Java 面向对象

Java 高级教程

Java 笔记

Java FAQ

java 浅拷贝


在 Java 中,浅拷贝是指创建一个新对象,新对象的字段值与原始对象相同,但是引用类型字段仍然引用原始对象中的相同对象。这意味着新对象和原始对象会共享一些数据。下面详细介绍几种浅拷贝的实现方式,并提供示例代码。

手动实现浅拷贝

这是一种最基本的浅拷贝方式,需要在目标对象中创建新的实例,并将原始对象的字段值复制到新对象中。

步骤流程:

  1. 创建一个新的类,该类应与原始类具有相同的字段。
  2. 在新类中,为每个字段添加相应的 getter 和 setter 方法。
  3. 在原始类中,编写一个方法,用于将原始对象的字段值复制到新对象中。
public class Person implements Cloneable {
    private String name;
    private int age;

    // Constructor, getters and setters

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

// Usage
public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person originalPerson = new Person("Alice", 30);
        Person clonedPerson = (Person) originalPerson.clone();

        System.out.println(originalPerson.getName()); // Output: Alice
        System.out.println(clonedPerson.getName());   // Output: Alice
    }
}

使用 Object.clone() 方法

Java 中的所有类都继承自 Object 类,它提供了一个默认的浅拷贝方法 clone()。要使用这个方法,你的类需要实现 Cloneable 接口,并重写 clone() 方法。

步骤流程:

  1. 让目标类实现 Cloneable 接口。
  2. 在目标类中重写 clone() 方法,并在方法中调用 super.clone()
public class Person implements Cloneable {
    private String name;
    private int age;

    // Constructor, getters and setters

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

// Usage
public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person originalPerson = new Person("Bob", 25);
        Person clonedPerson = (Person) originalPerson.clone();

        System.out.println(originalPerson.getName()); // Output: Bob
        System.out.println(clonedPerson.getName());   // Output: Bob
    }
}

使用 Apache Commons Lang 库

Apache Commons Lang 库提供了 SerializationUtils.clone() 方法,可以用于执行浅拷贝操作。这种方式依赖于序列化和反序列化,因此性能可能会受到影响。

步骤流程:

添加 Apache Commons Lang 依赖。

Maven 依赖坐标:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

Gradle 依赖坐标:

implementation 'org.apache.commons:commons-lang3:3.12.0'

使用 SerializationUtils.clone() 方法执行浅拷贝。

import org.apache.commons.lang3.SerializationUtils;

public class Person {
    // Fields, constructor, getters and setters
}

// Usage
public class Main {
    public static void main(String[] args) {
        Person originalPerson = new Person("Charlie", 28);
        Person clonedPerson = SerializationUtils.clone(originalPerson);

        System.out.println(originalPerson.getName()); // Output: Charlie
        System.out.println(clonedPerson.getName());   // Output: Charlie
    }
}

请注意,使用序列化方法进行浅拷贝可能会导致性能下降,因为它需要将对象序列化到字节数组,然后再进行反序列化。因此,在性能要求较高的场景中,建议使用其他方式实现浅拷贝。

总之,在选择浅拷贝实现方式时,你可以根据项目的需求和性能要求来进行选择。手动实现和 Object.clone() 都是原生的方法,而 Apache Commons Lang 则提供了更方便的方法,但可能会带来性能开销。

假设我们有一个名为`Person`的类,具有以下属性:###浅拷贝(ShallowCopy)浅拷贝只复制对象的引用,而不是对象本身。###使 ...
在Java中,实现Map的深拷贝通常需要复制Map中的每个键值对以及它们的值对象。###手动实现Map的深拷贝这个示例中,我们手动创建了一个 ...
在Python中,深拷贝是一种创建一个新对象,该对象包含原始对象的完整副本的过程。###方法3:使用copy模块的copy函数与递归`cop ...
Java 没有内置的字符串类型,而是在标准 Java 类库中提供了一个预定义类,很自然地叫做 String。每个用双引号括起来的字符串都是 ...
在Java中使用Redis主要涉及使用Redis客户端库来与Redis服务器进行通信。步骤流程:添加Maven依赖:编写Java代码示例:# ...