java深拷贝和浅拷贝(java深拷贝和浅拷贝面试题)

2qsc.com 阅读:83 2023-07-04 08:48:06 评论:0

Java深拷贝和浅拷贝

简介:

在Java中,对象的复制分为深拷贝和浅拷贝两种方式。深拷贝是创建一个全新的对象,并将原始对象的所有属性都复制到新对象中;而浅拷贝只是简单地复制引用,两个对象指向同一块内存地址。理解和掌握深拷贝和浅拷贝对于Java开发者来说至关重要,因为对象的复制操作在实际编程中经常遇到。

多级标题:

1. 浅拷贝

1.1 概念

1.2 示例

2. 深拷贝

2.1 概念

2.2 示例

3. 如何实现深拷贝

3.1 实现Serializable接口

3.2 使用Cloneable接口和clone方法

3.3 使用第三方库

内容详细说明:

1. 浅拷贝:

1.1 概念:

浅拷贝是指将对象的引用复制一份给新的对象,新对象和原始对象指向同一块内存地址。当原始对象的属性发生变化时,新对象的属性也会随之改变。浅拷贝通常使用Object类的clone方法来实现。

1.2 示例:

```java

class Person implements Cloneable {

private String name;

private int age;

public Person(String name, int age) {

this.name = name;

this.age = age;

}

@Override

protected Object clone() throws CloneNotSupportedException {

return super.clone();

}

}

public class Main {

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

Person person1 = new Person("John", 25);

Person person2 = (Person) person1.clone();

person2.setName("Alice");

System.out.println(person1.getName()); // Output: John

System.out.println(person2.getName()); // Output: Alice

}

}

```

在上述示例中,person1和person2是两个不同的对象,但是由于浅拷贝只是复制了引用,所以它们指向内存中的同一个Person对象。

2. 深拷贝:

2.1 概念:

深拷贝是指创建一个全新的对象,并将原始对象的所有属性都复制到新对象中。无论原始对象的属性发生怎样的变化,新对象的属性都不会受到影响。深拷贝通常通过序列化和反序列化、实现Cloneable接口和clone方法、以及使用第三方库等方式来实现。

2.2 示例:

```java

import java.io.Serializable;

class Address implements Serializable {

private String street;

private int number;

public Address(String street, int number) {

this.street = street;

this.number = number;

}

// Getter and Setter methods

}

class Person implements Serializable {

private String name;

private int age;

private Address address;

public Person(String name, int age, Address address) {

this.name = name;

this.age = age;

this.address = address;

}

// Getter and Setter methods

}

public class Main {

public static void main(String[] args) {

Address address = new Address("Main Street", 123);

Person person1 = new Person("John", 25, address);

Person person2 = null;

try {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(baos);

oos.writeObject(person1);

oos.close();

ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());

ObjectInputStream ois = new ObjectInputStream(bais);

person2 = (Person) ois.readObject();

ois.close();

} catch (Exception e) {

e.printStackTrace();

}

address.setStreet("New Street");

System.out.println(person1.getAddress().getStreet()); // Output: New Street

System.out.println(person2.getAddress().getStreet()); // Output: Main Street

}

}

```

在上述示例中,通过序列化和反序列化的方式实现了深拷贝,person1和person2是两个完全独立的对象,它们的属性互不影响。

3. 如何实现深拷贝:

3.1 实现Serializable接口:对象和对象引用的属性都实现Serializable接口,通过序列化和反序列化来实现深拷贝。

3.2 使用Cloneable接口和clone方法:重写clone方法,并在clone方法中对引用类型的属性进行深拷贝。

3.3 使用第三方库:许多第三方库(如Apache Commons、Google Guava等)提供了深拷贝的工具方法,可以简化深拷贝的实现过程。

综上所述,深拷贝和浅拷贝在Java中有着不同的实现方式和效果。在实际开发中,根据需要选择合适的方式来复制对象,以确保代码的正确性和可维护性。

搜索
排行榜
关注我们

趣书村