clone()或类似的复制方法是Java中的浅表复制。怎样才能成为真正的深层副本?

时间:2019-02-26 03:12:27

标签: java

例如,linkedList.clone()是浅表副本,而ArrayList.clone()也是浅表副本。在Java中,浅表副本似乎无处不在,因为它可以节省资源(不需要额外的内存和一个实体副本,只供其他人使用引用)。

然后我有以下关于Java浅表复制的结论草案:

1),我们知道=(等于操作符)复制了对列表的引用,这显然是浅表复制,因为它们指向相同的内存位置。

2)即使重新创建了新列表,在调用clone()时,其节点(节点的内容)仍是相同的引用,因此即使它们具有新列表的骨架,它们仍是浅表副本(甚至我们new()一个列表)

情况3)toArray()和toArray(T [] a)也是浅表复制,即使该方法具有new()一个新的Object [],但Object []内部的内容仍然由下面的行引用:         结果[i ++] = x.item; 因此即使使用new()函数,它们也是浅表副本。

是否有简单/简便的方法来帮助判断原始类型(加上String对象)和Object类型是深复制还是浅复制?是否有统一的答案或仍需要个案检查?

由于=(运算符相等)的递归引用副本,真的很难获得真正的深层副本吗?在成为真正的深层复制功能之前,方法内部应有多深? :-)

我必须在遇到引用后立即创建一个真正的new()实体吗?这将是一个无休止的递归循环。

0 个答案:

没有答案