【问题标题】:Problem with copying a single item of an ArrayList [duplicate]复制 ArrayList 的单个项目的问题[重复]
【发布时间】: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 中获取单个项目的完整副本吗?

【问题讨论】:

  • "似乎 java 只复制了一个引用" 没错。这就是为什么它们(ListeName)被称为引用变量
  • 仅供参考: Java 命名约定是 变量 名称以小写字母开头,因此它们应该是 listename

标签: java arraylist


【解决方案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 的链接一起帮助我解决了我的问题 :)
猜你喜欢
  • 2017-07-01
  • 2011-04-27
  • 2017-03-29
  • 2021-06-23
  • 2015-12-26
  • 2021-12-09
  • 1970-01-01
  • 2021-09-19
  • 2021-05-29
相关资源
最近更新 更多