Декларация ArrayList против конверсии
Я довольно не знаком с моим программированием на Java, и я занимаюсь курсом Google Udacity в качестве переподготовки. Я прошел урок 1 в приложении Sunshine, где лектор решил создать поддельные данные, объявив массив строк и затем преобразовывая его в ArrayList.
Код следующий:
String[] data = {
"Mon 6/23 - Sunny - 31/17",
"Tue 6/24 - Foggy - 21/8",
"Wed 6/25 - Cloudy - 22/17",
"Thurs 6/26 - Rainy - 18/11",
"Fri 6/27 - Foggy - 21/10",
"Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18",
"Sun 6/29 - Sunny - 20/7"
};
List<String> weatherForecast = new ArrayList<>(Arrays.asList(data));
Мне было интересно, есть ли какие-либо преимущества в использовании этого метода конвертации? Почему бы просто сразу не объявить данные как ArrayList как таковые:
ArrayList weatherForecast = new ArrayList();
weatherForecast.add("Today - Sunny - 88/63");
weatherForecast.add("Tomorrow - Foggy = 70/46");
weatherForecast.add("Weds - Cloudy - 72/63");
weatherForecast.add("Thurs 6/26 - Rainy - 18/11");
weatherForecast.add("Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18");
weatherForecast.add("Sun 6/29 - Sunny - 20/7");
Спасибо!
Ответы
Ответ 1
"Обычным" способом будет использование третьей формы:
List<String> weatherForecast = new ArrayList<>();
Collections.addAll(weatherForecast,
"Mon 6/23 - Sunny - 31/17",
"Tue 6/24 - Foggy - 21/8",
"Wed 6/25 - Cloudy - 22/17",
"Thurs 6/26 - Rainy - 18/11",
"Fri 6/27 - Foggy - 21/10",
"Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18",
"Sun 6/29 - Sunny - 20/7");
Список - это интерфейс, который позволит использовать другой класс реализации, например LinkedList (всего несколько элементов). Также полезно в качестве типа параметра.
Это использует класс утилиты Collections для добавления строк varargs ...
. И использует под капотом a String[]
для этих аргументов.
.asList
для первого параметра будет достаточным для добавления List<String>
.
Ответ 2
Оба делают то же самое.
Но разница в том, что первое делает его более читаемым. Вы точно знаете, что добавляете информацию о погоде в список.
Во втором случае вы просто продолжаете добавлять информацию, используя add()
, это выглядит немного неуклюже, чем другое.
Предположим, что вы добавляете простые числа в список
First Approach:
int [] primeNums = {2, 3, 5, 7, 11, 13, 17, 19};
List<Integer> primes = new ArrayList<>(Arrays.asList(primeNums));
Second Approach:
List<Integer> primes = new ArrayList<>();
primes.add(2);
primes.add(3);
primes.add(5);
primes.add(7);
primes.add(11);
primes.add(13);
primes.add(17);
primes.add(19);
Также вы можете перебирать массив и добавлять его.
for(int i = 0; i < primeNums.length; ++i)
primes.add(primeNums[i]);
Ответ 3
Первый подход:
- Лучшая читаемость (может быть даже лучше, см. мою альтернативу); все данные разделяются непосредственно запятой, а не вызовом метода для добавления каждого из них.
-
Arrays.asList
Создайте список фиксированного размера для данного конкретного массива, используя его внутренний класс ArrayList
, который является всего лишь оберткой вокруг самого массива, что делает его более эффективным, чем создание полной копии массива.
- Вы сохраняете данные в переменной
List
вместо переменной ArrayList
, которая дает вам больше гибкости.
Второй подход:
- Вы используете исходные типы, это плохо в начале.
- Нет преимуществ.
Пожалуйста, если вы используете этот подход, по крайней мере объявите свой List
общим образом:
ArrayList<String> weatherForecast = new ArrayList<>();
Альтернатива:
Обратите внимание, что вы можете напрямую:
List<String> weatherForecast = Arrays.asList(
"Mon 6/23 - Sunny - 31/17",
"Tue 6/24 - Foggy - 21/8",
"Wed 6/25 - Cloudy - 22/17",
"Thurs 6/26 - Rainy - 18/11",
"Fri 6/27 - Foggy - 21/10",
"Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18",
"Sun 6/29 - Sunny - 20/7"
);
Ответ 4
Производительность разумна, ваш ответ может быть лучше, потому что вы создаете единственную структуру данных (ArrayList) и добавляете к ней свои элементы. За исключением части читаемости, ваш инструктор создает экземпляр обоих массивов и затем покрывает его в массивList, который является растущим массивом. Это может быть не так сильно, но вы, безусловно, быстрее.
Ответ 5
Оба делают то же самое; но читаемость кода имеет значение;
Рассмотрим пример -
Приложению разрешено помещать значения в массивы до максимальной емкости и за эту ссылку, максимальное значение Integer.MAX_VALUE - 5
может быть разрешено в массиве.
После того, как массив заполнен, разработчику необходимо преобразовать его в список, как вы делаете выше.
Теперь подумайте, если кто-то использует метод add
в этой ситуации, тогда определенные строки кода будут расти, и код станет трудно читать.
Итак, в этой ситуации предпочтительная операция будет использовать Arrays.asList(data)
;
Ответ 6
Нет особого преимущества.
В вашем первом случае вы без необходимости обертываете массив, созданный Arrays.asList()
, как новый массив.
Используйте второй случай, если содержимое массива статично.