首页 > 代码库 > Java里的Deep Copy和Shallow Copy

Java里的Deep Copy和Shallow Copy

以前从来没听说过这两个名词,这几天用List和Map的时候发现bug,才第一次在stackoverflow上知道有这么两个简单的专业术语可以形容我遇到的问题。

写下来的都是基于自己的理解,或许不准确,如果以后发现不对再回来修正。

首先,Java的数据类型只有两种:primitive type和object type。

基本数据类型(primitive type)在赋值的时候,只存在一种情况,因为他们的内存位置就是他们的实际值的位置,如果把一个变量赋值给另一个变量,也会在内存增加一个新的值。

对于引用类型(object)才会存在两种情况,因为object本身就有两个值。一个是内存地址,另一个是这个内存地址存放的object本身的值。当你把一个变量赋值给另一个变量时,存在两种情况:

1. 只copy内存地址给这个新变量,这种情况下,两个变量指向的是同一个内存位置,任何一个变量对其进行修改都会影响另一个变量。这就是所谓的shallow copy。

2. 把object的值重新生成一份,也就是说两个变量虽然值相等,可是在内存里拥有不同的位置,彼此互不影响。这是deep copy。

其实我不太想得到什么情况下要shallow copy,看起来就是个多余的变量而已啊。

 

Java里的Deep Copy和Shallow Copy