浅复制与深复制-集合储存的引用

发现问题

今天看一个面试题的时候发现了浅复制与深复制的这个问题,题是这样的:

  1. 首先定义一个自定义类型,其中该类型的一个字段为id,然后为该字段赋值id=1。
  2. 接着定义两个ArrayList,把该类分别放入这两个list中。
  3. 修改其中的list的一个id=2,那么另外一个list的id会变么?

分析问题

  1. 按照正常的思维肯定是不会变的呀,因为修改的是其中一个ArrayList中对象的值,为什么另外一个的也会改变呢?可是运行出来的结果发现两个都变成了2.
  2. 这就涉及到了要聊的浅复制与深复制,因为当定义该Class的时候Java虚拟机会在内存中开辟一块空间存放id为1的对象。其中放入到两个list中的是对于该地址的引用。
  3. 所以当获取到该引用修改对象时候,改变的是内存地址中的值。两个list里面的引用是没变的。

解决问题

  1. 那么如何解决这样的问题呢,我们可以使用clone()方法来解决。定义好第一个Class的对象之后,调用clone()方法来赋值给第二个对象。
  2. 这样会在内存空间中再开辟一片空间给第二个对象,再次分别放入list1和list2中,修改list1中的id值,并不会影响到list2中的id值。

你可能感兴趣的:(浅复制与深复制-集合储存的引用)