【问题标题】:List gets updated with the latest values inserted to the Object使用插入到对象的最新值更新列表
【发布时间】:2019-03-07 22:36:20
【问题描述】:
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,因为它是最后插入的值。

【问题讨论】:

  • 您不是将对象的 副本 放入列表中,而是对对象本身的引用。无论如何,您都会将不同的对象放入列表中。
  • “除了创建一个新的对象和分配之外的任何方法来解决这个问题”......不,也没有必要害怕创建新的对象。
  • "除了创建一个新的对象并分配之外的任何方法来解决这个问题。" 不,如果你希望列表有 2 个不同的东西,你需要创建 2 个不同的东西,而不仅仅是修改一件事。
  • 为什么不使用 Set 而不是 List 来存储 Cars 对象? (额外的工作 -> 你必须在 Cars 类中实现 hashcode 和 equals 以获得唯一性)

标签: java arrays object arraylist


【解决方案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 类构造函数并通过构造函数为对象传递值。而且您可以简单地在 .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"));
    

    这应该可以正常工作:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 2019-01-11
      • 2011-06-02
      • 1970-01-01
      • 2021-05-18
      相关资源
      最近更新 更多