Производительность Java, избегайте создания новых в цикле - PullRequest
1 голос
/ 17 января 2012

У меня есть такой код

Map<String, List> searchMap = new HashMap<String, List>();
for(int i=0; i<something.size(); i++){
 List<String> list = new ArrayList<String>();
 list = getResult(...);
 ...
 searchMap.put(differentkey, list);
}

Каждый раз, когда я создаю новый список в цикле. Как избежать создания нового списка в цикле.

Ответы [ 5 ]

6 голосов
/ 17 января 2012

Просто не создавайте Список вообще, поскольку он даже не используется в показанном вами коде.

List<String> list = getResult(...);
1 голос
/ 17 января 2012

Попробуйте вместо этого:

Map<String, List> searchMap = new HashMap<String, List>();
for(int i=0; i<something.size(); i++){
    List<String> list = getResult(...);
    ...
    searchMap.put(differentkey, list);
}

Нет необходимости создавать новый список.

1 голос
/ 17 января 2012

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

В частности, вы не делаете хочет просто очистить список на каждой итерации - иначе каждая запись на карте будет ссылаться на тот же список .

Теперь вам не нужно создавать пустой список, который вы затем игнорируете - вы можете сразу присвоить значение переменной getResult() в объявлении:

List<String> list = getResult(...);

Скорее всего, будет создаваться новый список на каждой итерации (если getResult() не возвращает существующий), но это, вероятно, то, что вам нужно в любом случае.

Обратите внимание, что нет никакой выгоды объявлять list переменную вне цикла - объявление переменной не делает 'Это не влияет на производительность, но, как правило, рекомендуется ограничить область видимости переменной настолько, насколько это возможно, поэтому я бы оставил объявление там, где оно есть.

0 голосов
/ 17 января 2012
for(int i=0; i<something.size(); i++){
 List<String> list = new ArrayList<String>();
 list = getResult(...);

эквивалентно

for(int i=0; i<something.size(); i++){
 List<String> list = getResult(...);

Но я не уверен, действительно ли вы ищете это.

0 голосов
/ 17 января 2012
Map<String, List> searchMap = new HashMap<String, List>();
List<String> list = new ArrayList<String>();
for(int i=0; i<something.size(); i++){
    list = getResult(...);
    ...
    searchMap.put(differentkey, list);
}

В 4-й строке (list = getResult(...);) вы назначаете новый объект вашей переменной list. Поэтому нет необходимости создавать новый список до этого. Ваша переменная все равно будет заменена.

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