为什么我通过以下方式得到不同的行为:

  • Collection col2 = new ArrayList(col);
  • Collection col2 = new ArrayList();col2.addAll(col)

  • 我正在与查看者一起工作,并且代码很复杂,并且我试图解释问题的“根源”。另一个有趣的事实是下一个...
    //IF i use this code i have the correct behavior in my app:
    public void updateCollection(Collection<Object> col) {
        this.objectCollection.clear();
        this.objectCollection.addAll(col);
    }
    
    //IF i use this code i have unexpected behavior in my app:
    public void updateCollection(Collection<Object> col) {
        this.objectCollection=new ArrayList(col);
    }
    

    最佳答案

    此代码有效:

    public void updateCollection(Collection<Object> col) {
        this.objectCollection.clear();
        this.objectCollection.addAll(col);
    }
    

    但这带来了问题:
    public void updateCollection(Collection<Object> col) {
        this.objectCollection=new ArrayList(col);
    }
    

    我怀疑您的第一种方法的这种变化会带来相同的问题:
    public void updateCollection(Collection<Object> col) {
        this.objectCollection = new ArrayList();
        this.objectCollection.clear();
        this.objectCollection.addAll(col);
    }
    

    为什么?显然,您在某处使用了另一个对objectCollection的引用。在代码中的某个地方,另一个对象在说(例如):

    myCopyOfObjectCollection = theOtherObject.objectCollection;

    如果您使用的是 setter/getter ,则不会改变其基本行为-您仍在保留其他引用。

    因此,如果在初次分配时,假设该集合包含{1、2、3},那么您将从:
  • this.objectCollection:{1,2,3}
  • that.copyOfObjectCollection:{1,2,3}

  • 当您向this.objectCollection分配一个新的ArrayList并使用{4,5,6}进行填充时,您将获得以下信息:
  • this.objectCollection:{4,5,6}
  • that.copyOfObjectCollection:{1,2,3}

  • “that”仍指向原始ArrayList。

    关于java - Java addAll(collection)与新的ArrayList(collection),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4238654/

    10-10 01:52