java - 填充 ArrayList 时遇到问题

标签 java arraylist

我无法理解为什么我的代码会出现这样的行为。我所做的是创建自定义类的 ArrayList。填充类对象,然后将其添加到 ArrayList。然后,我重用该类对象并用新值填充它,并将其添加到 ArrayList 中,除非第一个被第二个覆盖?是否存在某种内部指针或数组列表尚未提交可能导致此问题?

在这里我声明我的ArrayList

private ArrayList<LiftData> arrylst_LiftData = new ArrayList<LiftData>();

然后我创建自定义数据对象(只是一个具有一些属性的类)

LiftData obj_LData = new LiftData();

一些未显示的代码用有效数据填充它,并将其添加到 ArrayList

arrylst_LiftData.add(obj_LData);

现在,代码将完成循环,用新值填充 obj_LData,然后将其添加到数组列表中,但第一个已经消失了???

如果我添加 ArrayList 下显示的第二行,则一切正常???

arrylst_LiftData.add(obj_LData);
obj_LData = new LiftData();

有人可以告诉我发生了什么吗?

最佳答案

ArrayList 与所有 Java 集合(实际上是 Java 中的所有变量)一样,包含对对象的引用,而不是对象本身。听起来您好像只创建了一个 LiftData 对象,并用对其的多个引用填充 ArrayList 。每次更改数据时,ArrayList 中的每个对象都会更改 - 因为它们都是同一个对象。

这与在 C++ 中使用基本相同的语法所得到的结果相反;插入到 vector 中将创建该对象的副本,您确实可以修改该对象,重新添加它,并在 vector 中获取两个不同的对象。但 Java 并不是这样工作的:所有对象类型的变量本质上都是指针。

在填充列表的循环中,您每次都需要创建一个新的 LiftData 对象。

关于java - 填充 ArrayList 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10623235/

相关文章:

java - 使用 Selenium WebDriver 和 Java 机器人类上传文件

java - 当我向 arraylist 添加值以将内容添加到 listview 时,android ram 不断上升

java - 关于java(Quartz)调度的初学者问题

Java 套接字 - 接收但不发送什么!

java - 比较两个数组列表并获取公共(public)元素的位置

java - Spock-忽略子类的规范方法

java - Java 中查找 ArrayList 中的对象

java.lang.IndexOutOfBoundsException : Index: 1, 大小:1

java - 使用返回不正确 boolean 值的 boolean 值数组列表反序列化对象

c# - 有没有办法像 ArrayList 一样对待 c# 静态数组?