Arrays.asList и Collections.addAll не работают с int [] array?

104
21 марта 2021, 12:40
int [] arr = {1, 2, 3, 4};
List list = new ArrayList();

вот так привести массив в List могу.

Arrays.stream(arr).forEach(o-> list.add(o));
for (int i = 0; i < arr.length; i++) list.add(arr[i]);
list = Arrays.stream(arr).boxed().collect(Collectors.toList());

а так нет:

   list = Arrays.asList(arr);
   Collections.addAll(list,arr);
   list = Stream.of(arr).collect(Collectors.toList());

при том что ЦИТАТА: Как и следует из документации Arrays.asList: формирует список на основе массива. Массив при этом используется для внутреннего представления списка. Таким образом сохраняется связь между списком и исходным массивом:

  1. изменения в массиве отразятся на списке
  2. изменения в списке отразятся на массиве НО это list = Arrays.asList(arr); бесполезная (censored) т.к. получаю [I@65b54208 а не 1,2,3,4 . получается объект arr поместил в list. спрашивается - где тут преобразование. такое слово даже ниже есть, только (censored) оно не преобразовывает

и ЦИТАТА: Collections.addAll(ArrayList list, T[] array) — лучший способ преобразовать Array в ArrayList, потому что массив данных копируется в список в виде самостоятельного объекта. А это значит, что исходный массив и результирующий ArrayList будут независимы друг от друга. ТАКЖЕ (censored) - смотреть выше.

ВОПРОС: везде где гуглю в примерах то стринги то классы(экзы с именами и т.д.). пробую найти ответ на запрос"java array to list" нашел только

 Integer[] spam = new Integer[] { 1, 2, 3, 4 };
    List<Integer> list = Arrays.asList(spam);

может я ищу Метод в коллекциях которого не существует. и нужно ввести еще одну операцию массив int в массив Integer??? и нет готового метода это сделать = получается нужно самому написать итерацию или создать новый массив Integer + и затем к нему применить методы из Arrays или Collections, различные варианты с Stream.of(arr) тоже не помогают. вообще не понятно что тут стримится, кажется что ничего. boxed() есть в Arrays.stream(arr).boxed() , но почемуто нету в Stream.of(arr). p.s. если тема вопроса тупая - то пусть модераторы удаляют,

кто умеет скройте плиз нижний текст в скрытый разворачивающийся текст.

зачем вообще я это пытаюсь понять везде по форумам массивы примитивов int и т.д. никто совершенно не рассматривает - всюду Object, и String(тот же object), может их вообще не используют по жизни в Java - это как устаревшее и массивы типа int это моветон, а т.к. памяти хватает - то все объявляют массивы (речь не идет о сетах мапах) сразу все в типах Integer Double и т.п, хоть они и занимают в четыре раза больше памяти? и как анекдот: зачем вообще нужно int [] в list загонять в реальных проектах тоже, не знаю. надеюсь со временем станет понятно. нужно это или нет.

Answer 1

Вы немного запутались.

В зависимости от вашей задачи вам может подойти один из этих способов преобразования массива примитивных интов в список:

int [] arr = {1, 2, 3, 4};
  1. List<Integer> list = Arrays.asList(arr);
  2. List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
  3. List<Integer> list = Stream.of(arr).collect(Collectors.toList());

Далее есть один нюанс. Arrays.asList() возвращает, согласно документации

fixed-size list backed by the specified array

Т.е. не обычный ArrayList, а такой, который не позволяет добавлять в него новые элементы. Именно по этому у вас не работает такой код:

list = Arrays.asList(arr);
Collections.addAll(list,arr); //тут вы пытаетесь в нерасширяемый список добавить его же копию.

Это обходят просто - оборачивают нерасширяемый список в ArrayList так:

List<Integer> list = new ArrayList<>(Arrays.asList(arr));

Второй нюанс - вывод в консоль содержимого списка. Т.к. в консоль выводится возвращаемое значение метода toString то, если он в к-л классе не переопределён, то может вернуть что-то типа I@65b54208. Однако, если вы пройдётесь циклом по списку и выведите каждый его элемент, то увидите, что всё в порядке.

По поводу использования примитивов и массивов. В лично моей практике они не используются. У списков и объектных аналогов примитивов больше методов и они гибче. Засим, проще код писать с их использованием. К тому же, если писать не на Java, а на Kotlin, то там вообще примитивов нет.

Да, память можно съэкономить на примитивах, но этим стоит заморачиваться только в особенных случаях. Если вам критично важно экономить байты и микросекунды и не критична красота и удобство кода - то используйте примитивы. Или вообще язык более низкого уровня. Иначе - используйте списки вместо массивов и, соответственно, объектные аналоги примитивов.

READ ALSO
Как сделать перезапуск spring?

Как сделать перезапуск spring?

Использую spring с docker-composeМне нужно чтобы при падении контейнера spring он перезапускался, определенное кол-во раз

86
Сложный палиндром

Сложный палиндром

Дана строкаИз данной строки необходимо сделать палиндром следующим образом:

115
Проблема с веб приложением Java, Spring Boot

Проблема с веб приложением Java, Spring Boot

Имеется Spring boot веб приложениеПри запуске с IntelliJ Idea сервер стартует, все работает нормально

78
Каким образом передать на устройство по bluetooth одновременно аудио и текстовое сообщение?

Каким образом передать на устройство по bluetooth одновременно аудио и текстовое сообщение?

Прошу подсказатьИмеется программа подобия радио-плеера на android, она воспроизводит звук (mp3, vaw) стриминговых сервисов icecast/shoutcast

106