【问题标题】:Is Java LinkedList Shallow Copy or Deep Copy by default?Java LinkedList 默认是浅拷贝还是深拷贝?
【发布时间】:2019-01-28 02:38:27
【问题描述】:

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

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

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

这条语句temp = temp.next 是否也会将左侧节点更改为temp.next?为什么?

【问题讨论】:

    标签: java linked-list


    【解决方案1】:

    两者都不是——这里没有复制,也许你把引用和复制混淆了,因为它们是两个不同的东西。每个节点都持有对下一个节点(如果存在)的引用,或者对 null(如果不存在)的引用。

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

    【讨论】:

    • 感谢您消除我的困惑。所以如果我做left.next,它会指向一个空地址吗?
    • @SarahSwanson:是的——它将是要么 null 或有效实例,具体取决于您的代码放在那里的内容。最好在使用前始终检查 null。
    • 列表中不会有null指针,所以除了插入一个不属于LinkedList的空引用外,不需要检查是否为空,你可以迭代列表没有任何问题。 Java 不是 C 或 C++
    【解决方案2】:

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

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

    【讨论】:

    • 哈哈是的,你说得对,我是从 c++ 转移过来的。谢谢您的帮助!这真的很有意义:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多