2014-12-19 2 views
3

Я использую два объекта списка Java, которые содержат некоторые данные.Две java Список объектов с одинаковой ссылкой?

Первый список содержит все объекты данных внутри него, а второй содержит некоторые данные (не все) из исходного списка.

Исходный список - это статический объект, к которому можно получить доступ.

Вот приведенный ниже код, который копирует все содержимое исходного списка в новый список и затем изменяет скопированный список, удаляя определенные элементы.

Проблема, с которой я сталкиваюсь, заключается в том, что она, кажется, производит эффект и удаляет те же элементы из первоначального списка!

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(); 
      } 
     } 

ответ

3

В этой строке кода:

deviceList = App.devices; 

вы не копируете список, но создать другую ссылку на него.

Чтобы сделать мелкую копию списка, вы можете использовать, например: ArrayList конструктор, который принимает Collection как параметр и делает копию.

Так оно и должно быть так:

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

как насчет 'deviceList = App.devices.clone()'? – dsharew

+0

ahh gotcha. благодаря! java и его проход по ссылке mechnism! – jonney

+0

@codehx Какая разница? –

2

deviceList = App.devices; не создает новый объект, но он просто указывает на App.devices объекта. Вы можете использовать ArrayList deviceList = new ArrayList(App.devices). Этот способ будет инициализировать новый объект ArrayList и не будет влиять на ваш объект статического списка.

Однако, имейте в виду, что будут применены какие-либо изменения на вашем объекте Device на обоих в списках тоже, потому что оба объекта внутри этих двух списков указывают на тот же адрес. Поэтому, если вы хотите применить отдельные изменения к своим объектам внутри своего deviceList, вам также следует создать новые объекты Device. Вы можете взглянуть на Deep and Shallow copy.

Смежные вопросы