Список обновляется последними значениями, вставленными в объект

#java #arrays #object #arraylist

#java #массивы #объект #arraylist

Вопрос:

 List<Cars> allValues = new ArrayList<Cars>();
Cars obj = new Cars();
obj.setKey("merc"); 
obj.setValue("true");
allValues.add(policyOrg1);
obj.setKey("audi"); 
obj.setValue("true");
allValues.add(obj);
  

У меня есть этот случай, когда мне нужно вставить два значения в мой список, и я использую один и тот же объект, а затем сбрасываю значение, как только ранее установленные ключ и значение были вставлены в список. Но, когда объект переназначается, я вижу, что значение, вставленное в список ранее, обновляется до последнего присвоенного значения. Любой способ решить эту проблему, кроме создания нового объекта и присвоения.

Результатом приведенной выше вставки является то, что в конечном итоге список содержит две записи с ключом audi и значением true, поскольку это последнее вставленное значение.

Комментарии:

1. Вы не помещаете копию объекта в список, вы помещаете ссылку на сам объект. Как бы вы это ни делали, вы будете помещать в список разные объекты.

2. «Любой способ решить эту проблему, кроме создания нового объекта и присвоения» … нет, и также не нужно бояться создания новых объектов.

3. » Любой способ решить эту проблему, кроме создания нового объекта и присвоения. » Нет, если вы хотите, чтобы в списке было 2 разных элемента, вам нужно создать 2 разных элемента вместо простого изменения 1 элемента.

4. Почему бы не использовать Set вместо списка для хранения ваших объектов Cars? (Дополнительная работа -> вы должны реализовать hashcode и equals в классе Cars для уникальности)

Ответ №1:

просто отредактируйте свой код следующим образом:

 List<Cars> allValues = new ArrayList<Cars>();

Cars obj = new Cars();
obj.setKey("merc"); 
obj.setValue("true");

allValues.add(obj);

obj = new Cars(); // you need to create a new object here
obj.setKey("audi"); 
obj.setValue("true");

allValues.add(obj);
  

Что вы делаете, это добавляете объект в список, затем обновляете тот же объект вместо создания нового.

Ответ №2:

Я думаю, что лучший подход — изменить конструктор вашего класса Cars и передать значения для объекта через constructor. И затем вы можете просто создать новый объект в методе .add().

 public Cars(String key,String value){
  //make your stuff here
 }
var allValues = new ArrayList<Cars>();//if you have Java 11 or higher use var
allValues.add(new Cars("merc","true"));
  

Это должно работать нормально 🙂