欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中深拷貝和淺拷貝的區(qū)別解析

 更新時間:2024年01月16日 10:45:02   作者:user2025  
這篇文章主要介紹了Java中深拷貝和淺拷貝的區(qū)別解析,淺拷貝是源對象和拷貝對象的存放地址不同,但被復制的源對象的引用類型屬性存放的地址仍然和源對象的引用類型屬性相同,修改引用類型屬性的屬性會影響相互影響,需要的朋友可以參考下

引用拷貝和對象拷貝

(1)引用拷貝:將對象的引用賦值給引用類型的變量

Object obj = new Object();
Object obj1 = obj;

(2)對象拷貝 創(chuàng)建對象的一個副本,其中副本和源對象的引用是兩個不同的地址,而不是把一個引用賦值給一個新的引用類型的變量

class Demo{
    public static void main(String[] args) throws CloneNotSupportedException {
        User user = new User();
        User user1 = (User)user.clone();
        System.out.println(user);
        System.out.println(user1);
    }
}
class User implements Cloneable {
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

淺拷貝和深拷貝都是對象拷貝

  • 淺拷貝:源對象和拷貝對象的存放地址不同,但被復制的源對象的引用類型屬性存放的地址仍然和源對象的引用類型屬性相同,修改引用類型屬性的屬性會影響相互影響。
  • 深拷貝:源對象和拷貝對象的存放地址不同,源對象和拷貝對象各自的引用類型存放的地址也和源對象的引用類型屬性不同,修改引用類型屬性的屬性不會相互影響拷貝對象和源對象。

常見的淺拷貝方式

(1)一個引用類型變量直接賦值給另一個變量

(2)BeaUtil.copyProperties()

常見的深拷貝方式

(1)通過構造器或new的方式

(2)重寫繼承至Object方法的clone方法,并實現Cloneable接口 如果在沒有實現Cloneable 接口的實例上調用 Object 的 clone 方法,則會導致拋出 CloneNotSupportedException 異常,實現Cloneable 接口的目的是:為了告知JVM,此對象允許拷貝

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        User user = new User(1, "測試");
        User user1 = user.clone();
        System.out.println(user1);
    }
}
class User implements Cloneable{
    private Integer id;
    private String name;
	//必須重寫此方法
    @Override
    protected User clone() throws CloneNotSupportedException {
        return (User)super.clone();
    }
    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
}

注意: 當通過Cloneable接口實現深拷貝時,拷貝的源對象的屬性如果是引用對象(String類型除外),則該屬性也需要實現Cloneable接口,并覆寫clone方法,否則該屬性是進行的淺拷貝。

深拷貝特殊情況(String類型)

String類型屬性:Clonable拷貝后兩個對象的相同屬性指向了通過字符串,但字符串是不可以修改的,存放在常量池中,當其中1個對象的該屬性指向另個字符串時,另外一個對象的屬性的引用仍指向原字符串。

public class ProtoTypeDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person = new Person();
        person.setId(1L);
        person.setName("test");
        User user = new User();
        user.setUsername("測試");
        person.setUser(user);
        Person person1 = person.clone();
        User user1 = user.clone();
        user1.setUsername("cs");
        person1.setUser(user1);
        System.out.println(person1);//Person{id=1, name='test', user=User{username='cs'}}
        System.out.println(person);//Person{id=1, name='test', user=User{username='測試'}}
    }
}
public class Person implements Cloneable {
    private Long id;
    private String name;
    private User user;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public Person clone() throws CloneNotSupportedException {
        return (Person) super.clone();
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", user=" + user +
                '}';
    }
}
public class User implements Cloneable{
    private String username;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    @Override
    public User clone() throws CloneNotSupportedException {
        return (User) super.clone();
    }
    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                '}';
    }
}

(3)序列化的方式:FastJson、Gson等都可以

class Main{
    public static void main(String[] args) {
        User user = new User(1, "測試");
        //序列化
        String s = JSONObject.toJSONString(user);
        //反序列化
        System.out.println(s);
        User user1 = JSON.parseObject(s, User.class);
        System.out.println(user1);
    }
}
public class User {
    private Integer id;
    private String name;
    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

到此這篇關于Java中深拷貝和淺拷貝的區(qū)別解析的文章就介紹到這了,更多相關Java深拷貝和淺拷貝內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mybatis一對多關聯關系映射實現過程解析

    Mybatis一對多關聯關系映射實現過程解析

    這篇文章主要介紹了Mybatis一對多關聯關系映射實現過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • SpringBoot整合SSO(single sign on)單點登錄

    SpringBoot整合SSO(single sign on)單點登錄

    這篇文章主要介紹了SpringBoot整合SSO(single sign on)單點登錄,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • idea文件被鎖無法更改問題

    idea文件被鎖無法更改問題

    這篇文章主要介紹了idea文件被鎖無法更改問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java easyui樹形表格TreeGrid的實現代碼

    Java easyui樹形表格TreeGrid的實現代碼

    這篇文章主要為大家詳細介紹了Java easyui樹形表格TreeGrid的實現代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 詳解spring集成mina實現服務端主動推送(包含心跳檢測)

    詳解spring集成mina實現服務端主動推送(包含心跳檢測)

    本篇文章主要介紹了詳解spring集成mina實現服務端主動推送(包含心跳檢測),具有一定的參考價值,與興趣的可以了解一下
    2017-09-09
  • Spring Cache的使用示例詳解

    Spring Cache的使用示例詳解

    SpringCache是構建在SpringContext基礎上的緩存實現,提供了多種緩存注解,如@Cachable、@CacheEvict、@CachePut等,本文通過實例代碼介紹了Spring Cache的使用,感興趣的朋友一起看看吧
    2025-01-01
  • @PathParam和@QueryParam區(qū)別簡析

    @PathParam和@QueryParam區(qū)別簡析

    這篇文章主要介紹了@PathParam和@QueryParam區(qū)別,分享了相關實例代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Java中數組的使用與注意事項詳解(推薦)

    Java中數組的使用與注意事項詳解(推薦)

    數組是一組地址連續(xù)、長度固定的具有相同類型的數據的集合,通過數組下標我們可以指定數字中的每一個元素,下面這篇文章主要給大家介紹了關于Java中數組的使用與注意事項的相關資料,需要的朋友可以參考下
    2021-08-08
  • Java的幾種文件拷貝方式示例詳解

    Java的幾種文件拷貝方式示例詳解

    在Java編程中文件操作是常見且重要的任務之一,其中文件拷貝是一種基本操作,這篇文章主要給大家介紹了關于Java幾種文件拷貝方式的相關資料,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2024-08-08
  • Java使用agent實現main方法之前的實例詳解

    Java使用agent實現main方法之前的實例詳解

    這篇文章主要介紹了Java使用agent實現main方法之前的實例詳解的相關資料,希望通過本文能幫助到大家,讓大家理解這部分內容,需要的朋友可以參考下
    2017-10-10

最新評論