复制 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 只复制了一个引用" 没错。这就是为什么它们(Liste
和 Name
)被称为引用变量。
仅供参考: Java 命名约定是 变量 名称以小写字母开头,因此它们应该是 liste
和 name
。
【参考方案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 的单个项目的问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章