2012-05-04 5 views
4

Итак, метод ниже, который я знаю, заставляет обе переменные указывать на один и тот же объект, но если бы я захотел найти простейший метод для того, чтобы ArrayList s2 был точно таким же, как s1, как бы я это сделал это?java - список копирующих массивов

public static void main(String[] args) { 

     ArrayList<String> s1 = new ArrayList<String>(); 
     for (int i = 1; i <= 3; i++) { 
      s1.add(""+i); 
     } 
     ArrayList<String> s2 = s1; 

    } 
+1

Обратите внимание, что вы выполняете ненужную конкатенацию строк в строке в цикле 'for'. Возможно, JVM оптимизирует это, но я бы использовал 'Integer.toString (i)' вместо '' "+ i', чтобы получить представление строки для int. – rob

ответ

5

Вы должны создать s2 с параметром s1 в качестве параметра.

public static void main(String[] args) { 

    ArrayList<String> s1 = new ArrayList<String>(); 
    for (int i = 1; i <= 3; i++) { 
     s1.add(""+i); 
    } 
    ArrayList<String> s2 = new ArrayList<String>(s1); 

} 
+2

Стоит отметить, что, хотя у вас теперь есть две ссылки на ** разные ** списки, ссылки внутри этих списков ** одинаковы **, поэтому изменения объектов, хранящихся в одном, будут влиять на другие. Не проблема при работе со строками (поскольку они неизменяемы), но общий смысл иметь в виду при работе со списками других типов объектов. –

+0

@ AnthonyGrist Да, я знаю об этом и хорошо упоминаю об этом. –

+0

@ Решение LuiggiMendoza также является тем, как я это сделал, но вы также можете использовать 's2.addAll (s1)' или 'Collections.copy (s1, s2)' после создания нового пустого 'ArrayList '. В классах 'Collections' и' Arrays' есть много других полезных методов, которые вы, возможно, захотите просмотреть, потому что они пригодится в какой-то момент. – rob

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