Java LinkedList是默认的“浅复制”还是“深复制”?

时间:2019-01-28 02:38:28

标签: java linked-list

对于默认情况下链表节点是浅表副本还是深表副本,我感到困惑。例如,当我们有以下代码时:

ListNode left = new ListNode(0);
ListNode temp = left;

temp.next = new ListNode(3);
temp = temp.next;

此语句temp = temp.next也会将左侧的节点也更改为temp.next吗?为什么?

2 个答案:

答案 0 :(得分:1)

Java不是C ++,它将复制在堆栈存储器上构造的实例。因此,所有Java对象都是在堆内存上创建的,因此不会发生任何复制任务。

我认为您来自C ++,除非您使用new关键字创建,否则当您将其作为参数传递或分配给其他变量时,它将在C ++中在堆栈内存中创建的对象发生复制。但是Java对象通常在堆上创建,因此不会发生任何复制任务。因此,请放心使用Java对象,但要小心使用C ++对象(在堆栈上)

答案 1 :(得分:1)

两者都不是-这里没有进行复制,也许您是将引用与副本混淆了,因为它们是两回事。每个节点都有对下一个节点的引用(如果存在),如果不存在,则为null。

在“副本”中创建一个类型的全新实例,该实例将复制相同类型的现有实例的状态,如果新实例包含的引用字段与该实例的引用完全相同,则复制该实例的状态为浅如果新实例的引用字段包含状态与原始实例相同的新实例,则为原始副本和深层副本,.....但您在问题中无处创建深层或浅层新副本实例。