2016-03-24 3 views
0

В моей бизнес-логике я хочу полностью заменить один список другим списком.Заменить один список массивов другим списком

Подходит ли подход ниже?

public class TestListReplacement { 

    public static void main(String[] args) { 

     List<String> values= new ArrayList<String>(); 
     values.add("a"); 
     values.add("b"); 
     values.add("c"); 
     values.add("d"); 
     values.add("e"); 
     values.add("f"); 

     List<String> valuesNew= new ArrayList<String>(); 
     valuesNew.add("g"); 
     valuesNew.add("h"); 
     valuesNew.add("i"); 
     valuesNew.add("j"); 
     valuesNew.add("k"); 

     values= valuesNew; 
     for(String val:values){ 
      System.out.println(val); 
     } 
    } 
} 

Это похоже на работу, но я хочу знать, может быть, в некоторых случаях это может не сработать.

+0

его правильно и будет работать все время –

+1

Ваш код не делает ничего конкретного со списком. Он просто показывает ссылку на объект переменной, перезаписываемую с помощью другой ссылки на объект. Если вы пытаетесь обновить значения в существующем списке, это не то, что делает ваш код. Если вы ожидаете увидеть другие места в своем коде, которые ссылаются на этот список, чтобы увидеть новые значения, этого не произойдет. Основываясь на вашем описании выше и примере изолированного кода, неясно, к какой проблеме вы пытаетесь обратиться, и работает ли ваше решение или нет. – nbrooks

+1

На самом деле, этот вопрос является дубликатом http://stackoverflow.com/questions/3823398/better-practice-to-re-instantiate-a-list-or-invoke-clear (и нескольких других). – nbrooks

ответ

4

Если я правильно понимаю, что вы пытаетесь сделать, что о

values.clear(); // delete original contents in the list 
values.addAll(valuesNew); // insert everything in the new list 

Чтобы добавить некоторый контекст из ответов от @nbrooks и других: Перезапись ссылки не всегда вариант и, откровенно говоря, воспринимаемая неэффективность итерации по коллекции дважды почти всегда не имеет отношения к практике. Если вам нужно сохранить тот же экземпляр списка (потому что он упоминается в других местах в коде), перезапись переменной не обновляет эти другие места.

+0

@Jonny Потому что, если список является членом какого-либо другого класса, последний не имеет никакого эффекта? Различные проблемы имеют разные решения, и этот ответ является наиболее простым для замены всех значений в данном списке новыми значениями. Переписывание переменной ничего не меняет для других ссылок на исходный, существующий список. – nbrooks

+0

@nbrooks не вызывает 'clear()' тратить время? вы скорее просто избавитесь от ссылки, и GC сделает для вас грязную работу, –

+0

@Debosmit. Это зависит от прецедента OP, который они не предоставили. Перезапись ссылки не всегда является опцией, и, честно говоря, воспринимаемая неэффективность итерации по коллекции дважды почти всегда не имеет отношения к практике. Если вам нужно сохранить тот же экземпляр списка (потому что он упоминается в других местах в коде), перезапись переменной не обновляет эти другие места. – nbrooks

Смежные вопросы