Java addAll(collection) vs new ArrayList(collection)

前端 未结 3 736
我寻月下人不归
我寻月下人不归 2021-01-08 00:08

Why do i get different behaviors with:

  1. Collection col2 = new ArrayList(col);

  2. Collection col2 = new ArrayList();

3条回答
  •  渐次进展
    2021-01-08 01:02

    This code works:

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

    But this introduces problems:

    public void updateCollection(Collection col) {
        this.objectCollection=new ArrayList(col);
    }
    
    
    

    I suspect that this variation on your first method would introduce identical problems:

    public void updateCollection(Collection col) {
        this.objectCollection = new ArrayList();
        this.objectCollection.clear();
        this.objectCollection.addAll(col);
    }
    
    
    

    Why? Evidently you have another reference to objectCollection in use somewhere. Somewhere in your code, another object is saying (for instance):

    myCopyOfObjectCollection = theOtherObject.objectCollection;

    If you're using a getter, that doesn't change the underlying behavior - you are still keeping another reference around.

    So if on initial assignment, say, the collection contained {1, 2, 3}, you start out with:

    • this.objectCollection : {1, 2, 3}
    • that.copyOfObjectCollection: {1, 2, 3}

    When you assign a new ArrayList to this.objectCollection, and populate it with, say, {4, 5, 6}, you get this:

    • this.objectCollection : {4, 5, 6}
    • that.copyOfObjectCollection: {1, 2, 3}

    "that" is still pointing to the original ArrayList.

    提交回复
    热议问题