Перевод arraylist в массив

From Arraylist to Array

I want to know if it is safe/advisable to convert from ArrayList to Array? I have a text file with each line a string:

I want to read them into array list and then i convert it to Array. Is it advisable/legal to do that?

9 Answers 9

Yes it is safe to convert an ArrayList to an Array . Whether it is a good idea depends on your intended use. Do you need the operations that ArrayList provides? If so, keep it an ArrayList . Else convert away!

This is the best way (IMHO).

This code works also:

But it less effective: the string array is created twice: first time zero-length array is created, then the real-size array is created, filled and returned. So, if since you know the needed size (from list.size() ) you should create array that is big enough to put all elements. In this case it is not re-allocated.

Whether it’s a «good idea» would really be dependent on your use case.

assuming v is a ArrayList:

There are two styles to convert a collection to an array: either using a pre-sized array (like c.toArray(new String[c.size()]) ) or using an empty array (like c.toArray(new String[0]) ). In older Java versions using pre-sized array was recommended, as the reflection call which is necessary to create an array of proper size was quite slow. However since late updates of OpenJDK 6 this call was intrinsified, making the performance of the empty array version the same and sometimes even better, compared to the pre-sized version. Also passing pre-sized array is dangerous for a concurrent or synchronized collection as a data race is possible between the size and toArray call which may result in extra nulls at the end of the array, if the collection was concurrently shrunk during the operation. You can follow the uniform style: either using an empty array (which is recommended in modern Java) or using a pre-sized array (which might be faster in older Java versions or non-HotSpot based JVMs).

This is the recommended usage for newer Java ( >Java 6)

In older Java versions using pre-sized array was recommended, as the reflection call which is necessary to create an array of proper size was quite slow. However since late updates of OpenJDK 6 this call was intrinsified, making the performance of the empty array version the same and sometimes even better, compared to the pre-sized version. Also passing pre-sized array is dangerous for a concurrent or synchronized collection as a data race is possible between the size and toArray call which may result in extra nulls at the end of the array, if the collection was concurrently shrunk during the operation. This inspection allows to follow the uniform style: either using an empty array (which is recommended in modern Java) or using a pre-sized array (which might be faster in older Java versions or non-HotSpot based JVMs).

Источник

Примеры преобразования списка в массив на Java

Хотя список является более мощным, чем массив в Java, в некоторых случаях мы хотим преобразовать первое в структуру данных последнего. Например, если есть существующий API, где ожидаемым параметром является массив, а у вас есть список.

Если вы оказались в таких ситуациях, вот несколько способов, которые могут помочь преобразовать список в массив на Java.

Преобразовать список в массив с помощью toArray()

Самый простой способ преобразовать список в массив — это использовать встроенный метод toList(). Вот код:

Этот метод не имеет аргумента и возвращает Object Array. Он создаёт новый массив, содержащий все элементы списка. Пример:

Как показано, toArray() возвращает массив объектов. myArray будет иметь 3 элемента — это то же самое, что и исходный список. Следовательно, ниже ожидаемый результат:
Apple
Banana
Orange

Обратите внимание, что тип возвращаемого значения — строго объектный массив. Если мы попытаемся привести результат к другому типу массива (например, массив строк), будет сгенерировано исключение.

И ниже результат, когда код выше выполняется. ClassCastException выдает во время выполнения.
Exception in thread «main» java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at Test.main(Test.java:10)
toArray() должен возвращать «безопасный» массив — это означает, что List не будет ссылаться на элементы возвращаемого массива. Другими словами, если вы измените массив, список не будет затронут. Рассмотрим пример ниже:

Изменение в результате (myArray) не повлияет на исходный список (myList). Следовательно, выходные данные кода будут отображать исходное содержимое списка, как показано ниже:
Apple
Banana
Orange

Конвертировать список в массив с помощью toArray (T [] a)

Если мы хотим, чтобы результат toArray возвращал определенный тип массива (например, массив строк), мы можем передать, какой тип он должен вернуть. Вот синтаксис:
T[] toArray(T[] a)
JavaDoc говорит, что параметр — это «массив, в котором должны храниться элементы этого списка, если он достаточно большой; в противном случае для этой цели выделяется новый массив того же типа».

Код передает массив String длиной 0. Поскольку элементы не помещаются, создается новый массив Array и возвращается вызывающей стороне.

В качестве альтернативы, мы можем передать массив, достаточно большой, чтобы содержать элементы списка. Вот пример:

Нам даже не нужно присваивать возврат метода toArray переменной. Содержимое хранится в параметре. myArray в этом случае получит значения List. И если мы запустим его, будет отображено следующее:
Apple
Banana
Orange
Подводный камень, который следует учитывать, заключается в том, что мы не можем автоматически преобразовать список определенного типа в массив другого типа с помощью метода toArray. Вот пример кода:

Приведенный выше код создаст исключение ArrayStoreException. Потому что он не может преобразовать список строк в массив целых чисел.

Используем пользовательский код

Можно использовать нашу собственную логику. Этот способ имеет некоторые преимущества. Вот простой пользовательский код для преобразования списка строк в массив строк Java.

В итоге, получаем результат:
Apple
Banana
Orange
Одним из преимуществ использования пользовательского кода является то, что у нас может быть дополнительная логика, не включенная в готовые вспомогательные классы.

Например, если мы хотим преобразовать исходные элементы списка в элементы конечного массива. Вот простой пример:

Как показано, оригинальный список содержит названия фруктов. Результат содержит фразы, которые используют фрукты. Вывод:
This is Apple
This is Banana
This is Orange

Переделать список строк в целочисленный массив

Вот еще один пример пользовательского кода, в котором мы переделаем список строк в массив целых чисел.

Результат показан ниже:
100
200
300

В двойной массив

Аналогично, здесь приведен пример пользовательского кода, который преобразует List of String в массив значений Double.

С использованием потоков в Java 8

Поток Java 8 предлагает очень крутые способы преобразования объектов.

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Источник

ArrayList в Java

Что такое класс ArrayList?

Что хранит ArrayList?

Конструкторы ArrayList

ArrayList()

Пустой конструктор с начальной емкостью внутреннего массива = 10.

В угловых скобках желательно указать тип хранимых значений. В примере выше — String .

_c)»>ArrayList(Collection c)

Конструктор принимает другую коллекцию, создавая новый массив с элементами переданной коллекции:

Порядок элементов в новом списке будет совпадать с исходным.

ArrayList(int initialCapacity)

В качестве параметра конструктора выступает значения начального размера внутреннего массива.

Если в массиве, который лежит в основе ArrayList, закончилось место при добавлении новых элементов, создается новый массив большего размера, и данные копируются в него. Если при написании кода заранее известно, что в массиве будет обрабатываться большое количество элементов, в целях оптимизации следует указать большее значение.

Методы ArrayList

Ниже представлены основные методы ArrayList.

add(E e)

Добавляет новый элемент в конец списка. Возвращает boolean -значение (true — успех, false — не добавлено):

add(int index, E element)

Добавляет элемент element в позицию index. При добавлении происходит сдвиг всех элементов справа от указанного индекса на 1 позицию вправо:

Очень полезен, когда нужно вставить элемент в произвольное место списка, однако для частых операций вставки в начало и середину ArrayList может оказаться не очень удачным выбором — следует изучить LinkedList.

_collection)»>addAll(Collection collection)

Добавление всех элементов коллекции collection в список в порядке их расположения в collection.

_collection)»>addAll(int index, Collection collection)

Добавление всех элементов collection в список начиная с индекса index . При этом все элементы сдвинутся вправо на количество элементов в списке collection :

Методы addAll() также возвращают boolean-результат добавления элементов.

clear()

Удаление всех элементов из списка.

clone()

Возвращает объект-копию массива:

Следует обратить внимание, что метод clone() возвращает Object , так что после его вызова потребуется сделать приведение к необходимому классу.

При клонировании создается новый независимый объект. В примере показано, как очищение клонированного объекта не сказалось на составе его клона.

contains(Object o)

Проверка наличие объекта в списке, возвращает boolean -значение.

ensureCapacity(int minCapacity)

Увеличивает размер внутреннего массива, чтобы в него поместилось количество элементов, переданных в minCapacity . Если массив достаточно вместителен, никакие преобразования не производятся.

Этот метод полезен, когда возникает потребность вместить большое количество элементов в несколько итераций. Например, при создании списка емкость его внутреннего массива — 10. При загрузке данных по сети они обрабатываются асинхронно порциями и результаты помещаются в массив. Если ожидается доставка 10 000 элементов, может быть неэффективно просто добавлять эти данные каждый раз: достаточно будет в начале обработки вызвать метод ensureCapaciry(10000) и записывать туда данные по мере необходимости.

_action)»>forEach(Consumer action)

Обработать в цикле ArrayList можно стандартными способами, цикл for:

В классе ArrayList есть метод для обработки каждого элемента, который называется также, forEach. В качестве аргумента передается реализация интерфейса Consumer, в котором нужно переопределить метод accept():

Метод accept принимает в качестве аргумента очередной элемент того типа, который хранит в себе ArrayList. Пример для Integer:

Метод action() будет выполнен для каждого элемента.

get(int index)

Возвращает элемент, который расположен в указанной позиции списка.

Если index или index >= максимального количества элементов списка, будет выброшено исключение IndexOutOfBoundsException .

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

indexOf(Object o)

Метод возвращает индекс первого вхождения элемента в списке. Если элемента не существует в списке, метод вернет -1.

isEmpty()

Метод возвращает true, если список пустой, false в обратном случае.

Если в списке содержатся только элементы null , метод вернет false. Иными словами, null элементы также учитываются этим методом.

iterator()

Возвращает итератор для списка для последующего использования в цикле или при любой другой обработке.

Итератор для ArrayList — fail-fast. Это значит, что если коллекция изменится во время итерации, будет выброшено исключение ConcurrentModificationException. Подробнее об fail-fast и его противоположности fail-safe можно почитать здесь.

lastIndexOf(Object o)

Функционал метода похож на indexOf() , отличие в том, что возвращается индекс последнего элемента в списке.

Если элемент не найден, также возвращает -1.

remove(int index)

Удаление элемента в указанной позиции индекса. После удаления сдвигает все элементы влево для заполнения освободившегося пространства.

Если index или >= количество элементов списка, будет выброшено исключение IndexOutOfBoundsException . В результате метод возвращает элемент, который был удален.

remove(Object o)

Метод удаляет из списка переданный элемент o . Если элемент присутствует в списке, он удаляется, а все элементы смещаются влево. Если элемент существует в списке и успешно удален, метод возвращает true, в обратном случае — false.

_c)»>removeAll(Collection c)

Если необходимо удалить несколько элементов, не стоит делать это в цикле по условию: гораздо удобнее и безопаснее воспользоваться методом removeAll() . Он принимает коллекцию элементов, которая будет удалена из списка.

Коллекция должна содержать элементы того же типа, которые хранит целевой список. В обратном случае будет выброшен ClassCastException . Метод вернет true, если список был изменен в результате вызова метода.

set(int index, E element)

Замена элемента в указанной позиции index на переданный element . Индекс также должен быть больше нуля и меньше индекса последнего элемента, иначе будет выброшено исключение IndexOutOfBoundsException .

size()

Лучший способ (практически единственный) для того, чтобы узнать размер массива.

_c)»>sort(Comparator c)

Сортировка списка по заданному правилу. Правило сортировки представляет собой реализованный интерфейс Comparator с переопределенным методом compareTo() .

Переопределение нужно, если коллекция содержит объекты собственного класса. При работе со стандартными классами ( Integer , String и так далее) переопределение compareTo() требуется только для нестандартной сортировки.

toArray()

Превращает список в фиксированный массив. Обратите внимание, что метод возвращает массив объектов ( Object[] ). Если необходимо привести список в массив объектов определенного типа, в качестве параметра в метод можно передать массив, куда будут перемещены элементы списков.

Методы ArrayList в Java изучаются на курсе JavaRush. Первое знакомство происходит на седьмом уровне квеста Java Syntax, на лекции “Класс ArrayList”. На этом же уровне есть подборки задач — раз и два, в которых нужно использовать методы ArrayList, приведены дополнительные примеры работы с ArrayList и дженериками, а также объясняется разница между ArrayList и LinkedList. Это обширная тема изучения, поэтому в том или ином виде к Arraylist в Java (методы этого класса — лишь часть всего массива знаний, в который стоит углубиться) на курсе возвращаются и на следующих уровнях обучения — Core, Collections, Multithreading. Мы верим, что ежедневная практика написания кода — главный ключ к успеху в программировании. Поэтому JavaRush на 80% состоит из практических задач, мини проектов, задач-игр. Все это — сотни часов кодинга, которые помогут прокачать скилл.

Источник

Поделиться с друзьями
admin
Оцените автора
( Пока оценок нет )
Как переводится?
Adblock
detector