Декларация 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(), как новый массив.

Используйте второй случай, если содержимое массива статично.