知识卡片

浅拷贝与深拷贝的区别及String的特殊性

普通读书笔记卡 · 1852.b.5

内容

Object默认的clone()是浅拷贝:只复制对象本身,内部数组、集合等引用型成员仍与原对象共享, 修改克隆体会连带影响原对象。深拷贝做法是在clone()内手动对引用型成员再调用一次它自己的 clone。此规则只影响类的可变引用型成员变量;String虽是引用类型但Java当作不可变处理 (字符串池),浅拷贝对它安全。发散:深浅拷贝不建议混用,整个类要么全深要么全浅。

参考来源

- 位置:《设计模式之禅(第2版)》第13章《原型模式》(源文件:_epub-src/text/part0060.html) - 结论依据:原文用ArrayList成员变量的浅拷贝实验证明克隆体修改会影响原对象,说明"Object类提供的方法clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝",并给出手动clone内部字段实现深拷贝的修改方案,同时解释String因字符串池机制不受此问题影响。 - 原始内容:Object类提供的方法clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝……使用原型模式时,引用的成员变量必须满足两个条件才不会被拷贝:一是类的成员变量……二是必须是一个可变的引用对象……对于String类型,Java就希望你把它认为是基本类型,它是没有clone方法的。