【问题标题】:Two java List objects having same reference?两个具有相同引用的java List 对象?
【发布时间】:2014-12-19 16:21:32
【问题描述】:

我正在使用两个包含一些数据的 java List 对象。

第一个列表包含其中的所有数据对象,第二个包含原始列表中的一些数据(不是全部)。

原始列表本身是一个可以访问的静态对象。

下面的代码将原始列表的全部内容复制到一个新列表中,然后通过删除某些元素来修改复制的列表。

我遇到的问题是它似乎会影响并从原始列表中删除相同的元素!

private List<Device> deviceList;
    deviceList = App.devices;

        //check which devices have not been added by checking the position data

        for (Iterator<Device> iterator = deviceList.iterator(); iterator.hasNext(); ) {
            Device device = iterator.next();
            if (device.getPosition() != Device.NO_POSITION) {
                iterator.remove();
            }
        }

【问题讨论】:

    标签: java list arraylist pass-by-reference


    【解决方案1】:

    在这行代码中:

    deviceList = App.devices;
    

    您不是在复制列表,而是在创建另一个对它的引用。

    要制作列表的浅表副本,您可以使用例如:ArrayList 构造函数,它接受 Collection 作为参数并进行复制。

    所以应该是这样的:

    private List<Device> deviceList = new ArrayList(App.devices);
    

    【讨论】:

    • deviceList = App.devices.clone() 怎么样?
    • @jonney Java 没有通过引用传递!
    • @pbabcdefp 只是干净而且 它更明确 我认为
    • @jonney:这是 NOT 通过引用传递的。它是引用的创建,Java 确实NOT 支持按引用传递。
    • 这里有很多线程表明这是通过我的参考而不是按值传递
    【解决方案2】:

    deviceList = App.devices; 不会创建新对象,它只是指向App.devices 对象。你可以使用ArrayList deviceList = new ArrayList(App.devices)。这将创建一个新对象 ArrayList 并且不会影响您的静态列表对象。

    但是,请记住,对您的对象 Device 的任何更改也将应用于您的列表中的两个对象,因为这两个列表中的两个对象都指向同一个地址。因此,如果您想对 deviceList 中的对象应用单独的更改,您还应该创建新的 Device 对象。你可能想看看Deep and Shallow copy

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多