Java中的深拷貝與淺拷貝

      網友投稿 844 2025-04-01

      深拷貝和淺拷貝區別是什么?

      數據分為基本數據類型和引用數據類型。基本數據類型:數據直接存儲在棧中;引用數據類型:存儲在棧中的是對象的引用地址,真實的對象數據存放在堆內存里。

      淺拷貝:對于基礎數據類型:直接復制數據值;對于引用數據類型:只是復制了對象的引用地址,新舊對象指向同一個內存地址,修改其中一個對象的值,另一個對象的值隨之改變。

      深拷貝:對于基礎數據類型:直接復制數據值;對于引用數據類型:開辟新的內存空間,在新的內存空間里復制一個一模一樣的對象,新老對象不共享內存,修改其中一個對象的值,不會影響另一個對象。

      深拷貝相比于淺拷貝速度較慢并且花銷較大。

      深拷貝/淺拷貝分析案例

      淺拷貝實現 Cloneable,深拷貝是通過實現 Serializable 讀取二進制流

      深拷貝實現:

      首先Person 對象實現 Serializable 接口,然后自定義深拷貝方法 deepClone():

      /** * 深拷貝 * * 注意:要實現序列化接口 * @return */ public Person deepClone() { try { // 輸出 (序列化) ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(this); // 輸入 (反序列化) ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); Person person = (Person) ois.readObject(); return person; } catch (Exception e) { e.printStackTrace(); return null; } }

      1

      2

      3

      4

      5

      Java中的深拷貝與淺拷貝

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      接下來驗證一下深拷貝是否成功:

      @Test public void testPropotype() throws CloneNotSupportedException { Person person1 = new Person(); person1.setAge(22); person1.setName("csp"); // 初始化list 并為其加入數據 person1.setList(new ArrayList<>()); person1.getList().add("aaa"); person1.getList().add("bbb"); System.out.println("person1:"+person1); //-----------------------------淺拷貝------------------------------- //Person person2 = person1.clone(); //-----------------------------深拷貝------------------------------- Person person2 = person1.deepClone(); person2.setName("hzw"); // 給peron2 中的list添加一條數據 person2.getList().add("ccc"); System.out.println("person2"+person2); System.out.println("person1:"+person1); boolean flag1 = person1 == person2; System.out.println("person1 和 person2 的 引用地址是否相同: " + flag1); boolean flag2 = person1.getList() == person2.getList(); System.out.println("person1 和 person2 的 list 引用地址是否相同: " + flag2); }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      輸出結果:

      空參構造函數調用... person1:Person{name='csp', age=22, list=[aaa, bbb]} person2Person{name='hzw', age=22, list=[aaa, bbb, ccc]} person1:Person{name='csp', age=22, list=[aaa, bbb]} person1 和 person2 的 引用地址是否相同: false person1 和 person2 的 list 引用地址是否相同: false

      1

      2

      3

      4

      5

      6

      由結果可得出:深拷貝 person2 所得到的 list 內存地址和原來person1 中的內存地址是不同的,深拷貝成功!

      Java 數據結構

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Excel表格中插入圖表方法介紹
      下一篇:字體自動變成鏤空
      相關文章
      久久精品国产亚洲AV麻豆~| 久久精品夜色噜噜亚洲A∨| 国产亚洲福利精品一区| 亚洲av片一区二区三区| 亚洲av乱码一区二区三区按摩| 国产成人亚洲合集青青草原精品 | 中文字幕亚洲精品资源网| 亚洲第一视频网站| 久久丫精品国产亚洲av| 色播亚洲视频在线观看| 亚洲视频欧洲视频| 亚洲成av人片在线看片| 久久亚洲国产精品成人AV秋霞| 亚洲午夜精品久久久久久人妖| 久久久久亚洲av无码专区导航| 亚洲视频在线免费播放| 亚洲日本视频在线观看| 亚洲成aⅴ人片在线影院八| 亚洲人配人种jizz| 国产亚洲精aa在线看| 亚洲欧洲无卡二区视頻| 亚洲AV无码国产精品永久一区| 亚洲午夜无码久久| 亚洲av无码成人精品国产| 婷婷亚洲综合一区二区| 亚洲黄黄黄网站在线观看| 久久久无码精品亚洲日韩软件 | 亚洲综合激情另类小说区| 33333在线亚洲| 亚洲欧洲国产综合AV无码久久| 国产AV无码专区亚洲AV蜜芽| 国产亚洲福利精品一区二区| 亚洲色图综合在线| 亚洲精品白浆高清久久久久久| 久久青青草原亚洲AV无码麻豆| 91久久亚洲国产成人精品性色| 亚洲一区免费视频| 亚洲精品久久无码av片俺去也| 国产成人亚洲精品91专区高清| 亚洲区小说区图片区| 久久亚洲高清观看|