首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObservableList未复制

ObservableList未复制
EN

Stack Overflow用户
提问于 2017-08-12 04:13:04
回答 1查看 869关注 0票数 2

编辑

事实证明,看起来

正在创建我的列表的浅层副本,而我实际上想要一个深层副本。

“指向”两个不同的

s,但

它们包含指向同一对象的“指针”,而不是副本。

原创

作为我正在制作的应用程序的一部分,用户可以打开

然后编辑它。为了允许他们取消和丢弃任何更改,我复制了以下内容

让他们在复印件上工作。然后,如果他们选择保存更改,我将更新

副本的内容。

复制是使用函数完成的

下面。此函数属于编辑窗口的fx控制器,并由主窗口的控制器调用。

代码语言:javascript
复制
public void setValues(ObservableList values) {
    if (values == null) {
        this.values = FXCollections.observableArrayList();
    } else {
        this.values = FXCollections.observableArrayList(values);
    }
    lstView.setItems(this.values);
}

就我所能找到的,上面的代码应该创建一个

所以

包含相同的信息,但并不相同

..。

但是

实际上,这两个对象看起来仍然是同一个对象,因此对

也将被设置为

..。

这是唯一一个

被赋予一个值。有谁知道我做错了什么吗?

这一切都是用JavaFX和Java8完成的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-12 05:06:32

要复制的列表包含对字符串数组的引用。该副本仅复制第一级引用-即对数组的引用,而不是这些数组中的字符串值。

我们在复制之后得到的是两个独立的列表,它们指向具有相同字符串的相同物理数组。以下是演示此行为的代码:

代码语言:javascript
复制
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]);
    }
}

这是一个更深层次复制的解决方案:

代码语言:javascript
复制
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]);
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45643095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档