Java addAll (коллекция) против нового ArrayList (коллекция) - PullRequest
11 голосов
/ 21 ноября 2010

Почему я получаю различное поведение с:

  1. Collection col2 = new ArrayList(col);

  2. 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);
}

Ответы [ 3 ]

15 голосов
/ 21 ноября 2010

Этот код работает:

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;

Если вы используете метод получения, это не меняет базового поведения - выпо-прежнему сохраняются другие ссылки.

Так что, если при первоначальном назначении, скажем, коллекция содержала {1, 2, 3}, вы начинаете с:

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

Когда вы назначаете new ArrayList для this.objectCollection,и заполнив его, скажем, {4, 5, 6}, вы получите следующее:

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

«Это» по-прежнему указывает на исходный ArrayList.

5 голосов
/ 21 ноября 2010
Collection col2 = new ArrayList(col);

создаст новый ArrayList с размером col.size() (+ 10%) и скопирует все элементы из col в этот массив.

Collection col2 = new ArrayList();

создаст новый ArrayList сначальный размер 10 (по крайней мере, в реализации Sun).

col2.addAll(col);

скопирует все элементы из col в конец col2 ArrayList, увеличив при необходимости размер вспомогательного массива.

Итак, в зависимости от размера вашей коллекции col, поведение будет немного другим, но не слишком большим.

Предпочтительно использовать первую опцию , которая позволит избежать хотя бы одной дополнительной операции расширения резервного массива.

0 голосов
/ 18 декабря 2014
    public List getAdminImIdsWithValidShortNames(){
    return adminImIdsWithValidShortNames;
}

public void setAdminImIdsWithValidShortNames(List adminImIdsWithValidShortNames){
    this.adminImIdsWithValidShortNames=adminImIdsWithValidShortNames;
}

Я думаю, легко это красиво, просто метод установки / получения генератора - хорошая привычка.если сначала очистить, а затем addAll, список должен очистить все элементы списка, тогда addAll будет дополнительной операцией расширения резервного массива, это не наука.

просто замена, эта переменная будет указывать на новый список,старый список будет автоматически GC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...