添加新节点时,链表的浅拷贝不反映更改

2024-02-25

diagram I have done a lot of readings but seems like I can't clear my confusion without asking here. Based on the diagram, when I create a a shallow copy of a linkedlist using clone(). A new linkedlist is created and the reference value of the head variable in the original is copied to the clone's and the rest of the nodes are shared. So if I add a new node using the clone, this should be visible to the orginal is it not? But when printing list1 out the value 3 is omitted. Can someone tell me why?

LinkedList<Integer> list1 = new LinkedList<>();
l1.add(1);
l1.add(2);
LinkedList<Integer> list2 = (LinkedList) l1.clone();
l2.add(3); 

clone()创造新的LinkedList结构并返回对第一个节点的新引用。这两者之间的关系LinkedLists 是它们共享同一个节点values。当你做一些add\ remove对旧列表或新列表的操作这些操作不会更改其他列表。这就是我们这样做的原因copy- 当我们更改副本时,我们不想更改原始链表结构。

From LinkedList.clone文档:

返回此内容的浅拷贝LinkedList. (The 元素本身 没有被克隆.) @return这个的浅拷贝LinkedList实例

考虑下面的例子:

import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicInteger;

public class LinkedListsApp {

    public static void main(String[] args) throws Exception {
        LinkedList<AtomicInteger> l1 = new LinkedList<>();
        l1.add(new AtomicInteger(100));
        l1.add(new AtomicInteger(200));

        LinkedList<AtomicInteger> l2 = (LinkedList) l1.clone();
        l2.add(new AtomicInteger(300));

        System.out.println(l1);
        System.out.println(l2);

        // change element on first list
        l1.get(0).incrementAndGet();

        System.out.println();
        System.out.println("After change internal state of first element");
        System.out.println(l1);
        System.out.println(l2);
    }
}

上面的代码打印:

[100, 200]
[100, 200, 300]

After change internal state of first element
[101, 200]
[101, 200, 300]

正如我们所看到的,当我们更改第一个列表中第一个元素的内部状态时,它对于第二个列表也是可见的。因此,不存在每个元素值的深层复制,而是结构的复制 - 节点和顺序的复制。

为了完全清楚,让我们看一下实施Java 8:

public Object clone() {
    LinkedList<E> clone = superClone();

    // Put clone into "virgin" state
    clone.first = clone.last = null;
    clone.size = 0;
    clone.modCount = 0;

    // Initialize clone with our elements
    for (Node<E> x = first; x != null; x = x.next)
        clone.add(x.item);

    return clone;
}

看看for-each环形。它迭代原始列表并将值添加到clone列表。方法add创造新的Node存储与原始列表相同值的对象:x.item.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

添加新节点时,链表的浅拷贝不反映更改 的相关文章

  • HashMap不写入数据库

    我尝试在我的数据库中写入 但只写入发件人和消息 我不明白为什么会发生这种情况 我认为问题出在我使用 sendMessage 的地方 我认为问题是我没有什么可以做的读 写其他用户的主键 我在数据库中写入消息的活动 public class M
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 如何在android中设置多个闹钟,在这种情况下最后一个闹钟会覆盖以前的闹钟

    我正在开发一个Android应用程序 用户可以在其中设置提醒时间 但我在以下代码中遇到一个问题 即最后一个警报会覆盖之前的所有警报 MainActivity java public void setreminders DatabaseHan
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 逃离的正确方法是什么?使用 Oracle 12c MATCH_RECOGNIZE 时 JDBCPreparedStatement 中的字符?

    以下查询在 Oracle 12c 中是正确的 SELECT FROM dual MATCH RECOGNIZE MEASURES a dummy AS dummy PATTERN a DEFINE a AS 1 1 但它不能通过 JDBC
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部

随机推荐

  • 沮丧:为什么:“A”是“B”无法访问的基础?

    与此错误消息的其他示例不同 我已经有一个指向A并想要检索实际的子类 这种安排是一些 C 包装的 C 代码的一部分A是一些 POD C 结构 为什么没有动态转换 和test是 C 中的一些回调 它调用 C 功能并检索正确的对象 应使用强制转换
  • 常规语言的抽引理

    我在使用泵引理检查给定语言是否规则时有点困惑 假设我们必须检查是否 L 接受偶数的语言0是否正常 我们知道它是正则的 因为我们可以为 L 构造一个 DFA 但我想用泵引理来证明这一点 现在假设我拿一个字符串w 0000 现在将字符串划分为x
  • 无法使用 Maven 从 .avsc 编译和创建 .avro 文件

    我是 Maven 新手 一直在查看教程和网络以获取有关如何从架构文件 avsc 构建 avro 的文档 基于 apache maven org 站点上的文档 我必须添加以下内容
  • 如何在C# TBB(C#代码片段)中添加用户定义的方法?

    我正在创建一个 C TBB C 代码片段 为此 我需要编写一个用户定义的方法 我尝试使用 如何在代码中访问用户定义的方法 提前致谢 请建议我一种解决此问题的方法 TOM NET API 参考提供了以下示例 log Debug Executi
  • Tensorflow/models 使用 COCO 90 类 ID,尽管 COCO 只有 80 个类别

    Tensorflows object detection 项目的标签图包含 90 个类别 尽管 COCO 只有 80 个类别 因此参数num classes在所有示例配置中设置为 90 如果我现在下载并使用COCO 2017数据集 我需要将
  • bash 中类似 zsh 的历史记录

    我真的很喜欢 zsh 的历史记录自动完成功能 也就是说 当我按下时 我会收到上一个命令 当我打字时emacs然后按向上键 我得到了我使用的最后一个 emacs 命令 当我打字时git然后按向上键 我得到了我使用的最后一个 git 命令 当我
  • alloca 函数崩溃,但 malloc 正常

    请解释一下崩溃的原因 我的第 3 方代码意外崩溃并出现 EXC BAD ACCESS static int overwrite selector struct srm target srm MARFileRemoverProgressBlo
  • 启动 SQLWorkbench/J 时出现“无法加载 Java 运行时环境”

    I get Unable to load Java Runtime Environment开始时SQLWorkbenchJ app https www sql workbench eu 我使用的是 macOS Catalina 10 15
  • 在 React JS 的回调中使用自定义钩子

    我有这个自定义钩子 const useSomething gt const displayAlert text gt alert text return displayAlert 现在我想在我的代码中的某个地方使用它 如下所示 const
  • 如何使请求绑定的数据在 Ktor 中全局可用?

    我正在 Ktor 中构建微服务 当我们在应用程序模块中工作时 Ktor 提供对call包含授权数据的对象 我的问题是我需要访问call来自服务级别类的对象 在 Spring 中 您可以通过访问SecurityContext这是全球可用的Th
  • 如何在CKeditor中添加音频标签

    我已经添加了html5audio插件并能够获取上传按钮 但如何将上传的文件发送到服务器 这是我的插件代码 id Upload hidden false filebrowser uploadButton label editor lang h
  • Bash 脚本在 Linux 中将 pdf 打印为 pdf

    这个问题可能听起来有点奇怪 但实际任务相对简单 我发誓 我使用 PDFCreator 将生成的 FDF 合并到预先存在的 PDF 中 从 Web 表单自动生成一些 PDF 我在 NitroPDF 中创建了预先存在的 PDF 此设置有效gre
  • 如何使用 Ruby 和 eventmachine 进行日志记录?

    我正在使用 Ruby 和 Eventmachine 库编写一个应用程序 我真的很喜欢非阻塞 I O 和事件驱动系统的想法 我遇到的问题是日志记录 我正在使用 Ruby 的标准记录器库 这并不是说日志记录需要永远进行 但它似乎不应该被阻止 但
  • TestNG - 将自定义属性添加到@Test注释

    我需要向现有的 Test 注释添加自定义属性 如下所示 Test description some description newAttribute some value public void testMethod unit integr
  • WordPress 从 get_the_tag_list 中排除标签

    当我使用自定义模板标签输出单个帖子标签时 如何从标签列表中排除已定义的标签名称 好吧 没有过滤器可以删除其中的术语get the tag list但在内部它要求get the terms所以你可以在那里添加过滤器 考虑这个例子 add fi
  • 无法找到或加载 Qt 平台插件“windows”

    首先 为了防止重复报告 我尝试了多种解决方案here https stackoverflow com questions 17366967 failed to load platform plugin windows available p
  • 运行时错误无法解析 GoogleMap 的所有参数:(?, ?)

    我正在尝试将基本地图加载到我的模板上 我只是按照这个说明操作https ionicframework com docs native google maps https ionicframework com docs native goog
  • htaccess 301 仅重定向根目录,但排除所有文件和子文件夹(有例外)

    我不是程序员 htaccess代码 我阅读了其他相关帖子但不明白它们 他们没有一个做我需要的事情 我有一个运行在以下位置的 WordPress 网站http example com main但想重定向http example com to
  • Renderscript 无法运行的设备列表

    我的应用程序需要 Renderscript 因为它执行一些在 Java 中需要几秒钟的图像处理 在发布之前 我已经在许多设备上测试了它 甚至是一些较旧的型号 例如 Samsung Galaxy Tab 2 API 17 并且即使在这些设备上
  • 添加新节点时,链表的浅拷贝不反映更改

    I have done a lot of readings but seems like I can t clear my confusion without asking here Based on the diagram when I