Метод add и Arrays.asList, альтернатива?
У меня есть метод add():
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Lemon");
и есть вот такой вариант (увидел в книге):
List<String> fruits = Arrays.asList("Apple", "Banana", "Lemon");
Одинаковы они? Это похоже на массив который заполняем = {"Apple", "Banana"}; и когда мы присваиваем индексу какое-нибудь значение, правильно?
Ответы (3 шт):
По большому счету то же, только во втором случае создается лист с фиксированным размером, тое добавить в него дополнительный элемент не удастся.
Как указано в документации Arrays.asList
Returns a fixed-size list backed by the specified array. (Changes to the returned list "write through" to the array.) This method acts as bridge between array-based and collection-based APIs, in combination with Collection.toArray. The returned list is serializable and implements RandomAccess. This method also provides a convenient way to create a fixed-size list initialized to contain several elements.
Используя этот метод, мы можем преобразовать массив в List фиксированного размера. Этот List - просто оболочка, которая делает массив доступным в виде списка. Никакие данные не копируются и не создаются.
Кроме того, мы не можем изменить его длину, потому что добавление или удаление элементов запрещено, при попытке выполнить операции add, remove вылетит UnsupportedOperationException.
Однако мы можем изменять отдельные элементы внутри массива.
И еще такой нюанс, все изменения, которые мы вносим в отдельные элементы List'a, будут отражены в нашем исходном массиве, например:
String[] stringArray = new String[] { "A", "B", "C", "D" };
List stringList = Arrays.asList(stringArray);
stringList.set(0, "E");
При попытке вывести оба списка в консоль, получим:
[E, B, C, D]
[E, B, C, D]
Как видите, наш исходный массив тоже был изменен. И List, и массив теперь содержат одни и те же элементы в одном порядке.
Верный ответ уже дан, но внесу свою маленькую капельку.
Чтобы избежать множества строк типа list.add() и при этом получить "нормальный", т.е. расширяемый лист можно написать List<String> strList = new ArrayList(Arrays.asList("1", "2", "3"));