编辑
事实证明,看起来
正在创建我的列表的浅层副本,而我实际上想要一个深层副本。
和
“指向”两个不同的
s,但
它们包含指向同一对象的“指针”,而不是副本。
原创
作为我正在制作的应用程序的一部分,用户可以打开
然后编辑它。为了允许他们取消和丢弃任何更改,我复制了以下内容
让他们在复印件上工作。然后,如果他们选择保存更改,我将更新
副本的内容。
复制是使用函数完成的
下面。此函数属于编辑窗口的fx控制器,并由主窗口的控制器调用。
public void setValues(ObservableList values) {
if (values == null) {
this.values = FXCollections.observableArrayList();
} else {
this.values = FXCollections.observableArrayList(values);
}
lstView.setItems(this.values);
}就我所能找到的,上面的代码应该创建一个
所以
和
包含相同的信息,但并不相同
..。
但是
实际上,这两个对象看起来仍然是同一个对象,因此对
也将被设置为
..。
这是唯一一个
被赋予一个值。有谁知道我做错了什么吗?
这一切都是用JavaFX和Java8完成的。
发布于 2017-08-12 05:06:32
要复制的列表包含对字符串数组的引用。该副本仅复制第一级引用-即对数组的引用,而不是这些数组中的字符串值。
我们在复制之后得到的是两个独立的列表,它们指向具有相同字符串的相同物理数组。以下是演示此行为的代码:
public class Main {
public static void main(String[] args) {
String [] a = {"aaa"};
List values = new LinkedList<>();
values.add(a);
List v2 = FXCollections.observableArrayList(values);
String[] b = values.get(0) ;
b[0] = "1";
System.out.println(v2.get(0)[0]);
System.out.println(values.get(0)[0]);
}
}这是一个更深层次复制的解决方案:
public class Main {
public static void main(String[] args) {
String [] a = {"aaa"};
List values = new LinkedList<>();
values.add(a);
List copy = new ArrayList<>();
for(String[] stringArray : values) {
String[] newArray = Arrays.copyOf(stringArray, stringArray.length);
copy.add(newArray);
}
values.get(0)[0] = "bbb";
System.out.println(values.get(0)[0]);
System.out.println(copy.get(0)[0]);
}
}https://stackoverflow.com/questions/45643095
复制相似问题