java—复制arraylist的单个项时出现问题

mv1qrgav  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(334)

这个问题在这里已经有答案了

java是“按引用传递”还是“按值传递”(84个答案)
如何制作对象的深度副本(20个答案)
21天前关门了。
我是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中获得一个项目的完整副本吗?

ee7vknir

ee7vknir1#


字符串类型存储在堆栈中。对象类型存储在堆中。

Liste.add("Harry");

您在堆栈的某个位置添加了一个字符串值“harry”。

Name = Liste.get(0);

然后你给它起了个参考名“name”

"Dieter";

您在堆栈中的某个位置创建了一个新值“dieter”。

Name = "Dieter";

“name”现在引用存储“dieter”的堆栈位置。

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

liste.get(0)个引用“harry”。

System.out.print(Name);

“name”引用“dieter”
与此同时,

Liste.add(new Names_Class());

新名称\u class()在堆中为名称\u class()指定一些内存空间

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

liste的第一个对象-名字引用“harry”

Name = Liste.get(0);

“name”引用了liste.get(0)正在引用的内容。

Name.First_Name = "Dieter";

“name”-first\u name引用“dieter”这与liste.get(0)相同。first\u name=“dieter”。

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

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

相关问题