Это означало бы, что он places является неизменяемым (попытка изменить его вызовет выдачу UnsupportedOperationException исключения).
Чтобы создать конкретный изменяемый список, ArrayList вы можете создать ArrayList из неизменяемого списка:
ArrayList<String> places = newArrayList<>(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
И импортируйте правильный пакет:
import java.util.Arrays;
Ответ 2
На самом деле, вероятно, "лучшим" способом инициализации ArrayList является метод, который вы написали, поскольку для него не нужно создавать новый List каким-либо образом:
ArrayList<String> list = newArrayList<String>(); list.add("A"); list.add("B"); list.add("C");
Загвоздка в том, что для ссылки на этот list экземпляр требуется довольно много ввода.
Существуют альтернативы, такие как создание анонимного внутреннего класса с инициализатором экземпляра (также известного как "инициализация двойными фигурными скобками"):
ArrayList<String> list = newArrayList<String>() {{ add("A"); add("B"); add("C"); }};
Однако мне не слишком нравится этот метод, потому что в итоге вы получаете подкласс ArrayList, у которого есть инициализатор экземпляра, и этот класс создан только для создания одного объекта - мне это кажется немного излишним.
Было бы неплохо, если бы было принято предложение о литералах коллекции для Project Coin (его планировалось внедрить в Java 7, но вряд ли оно станет частью Java 8).:
List<String> list = ["A", "B", "C"];
К сожалению, здесь это вам не поможет, так как будет инициализировать неизменяемый, List а не ArrayList, и, кроме того, он пока недоступен, если вообще будет доступен.
Arrays.asList(...) выдаст вам List*, подкрепленный массивом, поэтому он не может изменять длину.
Но вы можете вызвать List.set(...), так что это все равно изменяемый.
Это действительно допускает null элементы.
* Подробности реализации: Это частный вложенный класс внутри java.util.Arrays с именем ArrayList, который отличается от java.util.ArrayList класса, хотя их простые имена совпадают.
Статический импорт
Вы можете сделать Java 8 Arrays.asList еще короче с помощью статического импорта:
Но опять же, лучше просто использовать Stream напрямую, а не собирать его в List.
*Вам, вероятно, конкретно не нужен ArrayList. Цитирую JEP 269:
Существует небольшой набор вариантов использования для инициализации экземпляра изменяемой коллекции с предопределенным набором значений. Обычно предпочтительнее, чтобы эти предопределенные значения находились в неизменяемой коллекции, а затем инициализировать изменяемую коллекцию с помощью конструктора копирования.
(выделено мной)
Программа для интерфейсов, а не для реализаций
Вы сказали, что объявили список как ArrayList в своем коде, но вам следует делать это только в том случае, если вы используете какой-либо элемент ArrayList, которого нет в List.
Чего вы, скорее всего, не делаете.
Обычно вам следует просто объявлять переменные с помощью наиболее общего интерфейса, который вы собираетесь использовать (например, Iterable, Collection или List), и инициализировать их с помощью конкретной реализации (например, ArrayList, LinkedList или Arrays.asList()).
В противном случае вы ограничиваете свой код этим конкретным типом, и его будет сложнее изменить, когда вы захотите.
Например, если вы передаете ArrayList в void method(...):
// Iterable if you just need iteration, for (String s : strings): voidmethod(Iterable<String> strings) { for (String s : strings) { ... } }
// Collection if you also need .size(), .isEmpty(), or .stream(): voidmethod(Collection<String> strings) { if (!strings.isEmpty()) { strings.stream()... } }
// List if you also need random access, .get(index): voidmethod(List<String> strings) { strings.get(...) }
// Don't declare a specific list implementation // unless you're sure you need it: voidmethod(ArrayList<String> strings) { ??? // You don't want to limit yourself to just ArrayList }
Другим примером может быть постоянное объявление переменной an, InputStream даже если обычно это FileInputStream или a BufferedInputStream , потому что скоро вы или кто-то другой захотите использовать какой-то другой вид InputStream.