复制 ArrayList 的单个项目的问题[重复]

Posted

技术标签:

【中文标题】复制 ArrayList 的单个项目的问题[重复]【英文标题】:Problem with copying a single item of an ArrayList [duplicate] 【发布时间】:2021-03-29 13:09:23 【问题描述】:

我是 Java 新手,遇到了一个我找不到解决方案的问题,所以也许有人可以帮助我。当我写这段代码时:

ArrayList<String> Liste = new ArrayList<>();
String Name;

Liste.add("Harry");
Name = Liste.get(0);
Name = "Dieter";

System.out.print(Liste.get(0));
System.out.print(Name);

输出如预期:

Harry
Dieter

但是,如果我将类型更改为自定义对象:

ArrayList<Names_Class> Liste = new ArrayList<>();
Names_Class Name;

Liste.add(new Names_Class());
Liste.get(0).First_Name = "Harry";
Name = Liste.get(0);
Name.First_Name = "Dieter";

System.out.print(Liste.get(0));
System.out.print(Name);

输出变成:

Dieter
Dieter

所以看起来 Java 只复制了一个引用或其他东西。有人可以解释这里发生了什么,以及如何从 ArrayList 中获取单个项目的完整副本吗?

【问题讨论】:

另见:How do I copy an object in Java? "似乎 java 只复制了一个引用" 没错。这就是为什么它们(ListeName)被称为引用变量 仅供参考: Java 命名约定是 变量 名称以小写字母开头,因此它们应该是 listename 【参考方案1】:

String 类型存储在 Stack 中。 对象类型存储在堆中。

Liste.add("Harry");

您在堆栈的某处添加了字符串值“Harry”。

Name = Liste.get(0);

然后你给它一个参考名称“名称”

"Dieter";

您在堆栈的某处创建了一个新值“Dieter”。

Name = "Dieter";

'Name' 现在引用存储 'Dieter' 的堆栈位置。

System.out.print(Liste.get(0));

Liste.get(0) 引用“Harry”。

System.out.print(Name);

“姓名”引用“迪特”

与此同时,

Liste.add(new Names_Class());

new Names_Class() 在堆中为 Names_Class() 指定一些内存空间

Liste.get(0).First_Name = "Harry";

Liste 的第一个对象 - First_Name 引用“Harry”

Name = Liste.get(0);

'Name' 引用 Liste.get(0) 所引用的内容。

Name.First_Name = "Dieter";

'Name' - First_Name 引用 'Dieter' 这与 Liste.get(0).First_Name = "Dieter" 相同。

System.out.print(Liste.get(0));
System.out.print(Name);

它们都打印相同的值,因为 Name 引用与 Liste.get(0) 相同的位置

【讨论】:

感谢您的解释。这与来自 Aplet123 的链接一起帮助我解决了我的问题 :)

以上是关于复制 ArrayList 的单个项目的问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList 重复数据库中的相同数据? [复制]

如何在不复制数组的情况下返回 Javascript 中的数组减去单个项目? [复制]

ArrayList 中的项目重复

Java ArrayList toArray避免复制

从arraylist中获取不重复的项目[关闭]

如何制作 ArrayList 的单独副本? [复制]