Sdscompany.ru

Компьютерный журнал
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Метод toarray java

Списочный массив ArrayList

В Java массивы имеют фиксированную длину и не могут быть увеличены или уменьшены. Класс ArrayList реализует интерфейс List и может менять свой размер во время исполнения программы, при этом не обязательно указывать размерность при создании объекта. Элементы ArrayList могут быть абсолютно любых типов в том числе и null.

Пример создания объекта ArrayList

Можно инициализировать массив на этапе определения. Созданный объект list содержит свойство size. Обращение к элементам массива осуществляется с помощью метода get(). Пример :

Добавление элемента в массив ArrayList, метод add

Работать с ArrayList просто: необходимо создать объект и вставлять созданные объекты методом add(). Обращение к элементам массива осуществляется с помощью метода get(). Пример:

Замена элемента массива ArrayList, метод set

Чтобы заменить элемент в массиве, нужно использовать метод set() с указанием индекса и новым значением.

Удаление элемента массива ArrayList, метод remove

Для удаления элемента из массива используется метод remove(). Можно удалять по индексу или по объекту:

ПРИМЕЧАНИЕ: элементы, следующие после удалённого элемента, перемещаются на одну позицию ближе к началу. То же самое относится и к операции вставки элемента в середину списка.

Для очистки всего массива используется метод clear():

Определение позиции элемента ArrayList, метод indexOf

В списочном массиве ArrayList существует метод indexOf(), который ищет нужный элемент и возвращает его индекс.

Отсчёт в массиве начинается с 0, если индекс равен 2, значит он является третьим в массиве.

Проверка наличие элемента в ArrayList, метод contains

Чтобы узнать, есть в массиве какой-либо элемент, можно воспользоваться методом contains(), который вернёт логическое значение true или false в зависимости от присутствия элемента в наборе :

Понятно, что в массиве никаких овощей быть не может, поэтому в консоле будет отображено false.

Создание массива из элементов ArrayList, метод toArray

Для конвертирования набора элементов в обычный массив необходимо использовать метод toArray().

Интерфейс List

java.util.List является интерфейсом и его следует использовать вместо ArrayList следующим образом :

Или укороченный вариант для Java 7:

В примере тип ArrayList заменен на List, но в объявлении оставлен new ArrayList(). Всё остальное остаётся без изменений. Это является рекомендуемым способом.

Интерфейс List реализует более общий интерфейс коллекции Collection.

Преобразование массива в список, Arrays

Для создания массива можно не только добавлять по одному объекту через метод add(), но и сразу массив с использованием Arrays.asList(. ).

Пример создания и инициализации массива из объектов Integer.

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

ArrayList в Java с примерами

Сегодня мы поработаем с ArrayList в Java: посмотрим на примерах самые популярные и полезные методы.

Данный урок является прямым продолжением статьи Коллекции в java, в которой мы разобрали основы и структуру классов коллекций. Теперь, попробуем немного попрактиковаться на примерах.

ArrayList — коллекция на основе массива. Это означает, что она имеет все преимущества и недостатки массивов java.

Это также означает, что работа с элементами данной коллекции подразумевает под собой работу с элементами массива. То есть — «под капотом» данного класса находится массив в чистом виде. Фактически, разработчики предоставляют нам удобные и простые методы для работы с массивом. Соответственно, использовать ArrayList нужно тогда, когда необходима скорость чтения из коллекции, но менее важна скорость удаления данных.

Какие основные методы предоставляет нам ArrayList:

  • add(element) — добавляет элемент в коллекцию;
  • get(index) — достает элемент по индексу;
  • clear() — полностью очищает коллекцию;
  • addAll(another_collection) — добавляет один список в другой;
  • remove(index) — удяляет объект по индексу;
  • remove(object) удаляет по объекту;
  • removeAll(collection_with_remove_elements) — если нужно удалить целый список объектов;
  • size() — возвращает длину коллекции;
  • isEmpty() — проверяет на пустоту;
  • forEach() — обход всех элементов.

Выше я перечислил только самые используемые методы класса ArrayList. Теперь, посмотрим пример их использования:

Как видно на примере выше — работать с ArrayList очень просто и удобно. Названия методов говорят сами за себя.

Начнем с самого начала инициализации ArrayList. Все списки принимают только объекты одного типа. Поэтому, перед инициализацией необходимо указать: с каким типом данных мы будем работать. В примере выше я выбрал тип данных String поэтому должен был явно указать его при создании коллекции массива. Далее, при работе с колекцией, я должен добавлять только строки и работать со строками. Иначе, будет ошибка компиляции. Одной из причин появления классов оберток для примитивных типов является то, что коллекции не работают с примитивами — только с объектами. Поэтому, такой тип записи работать не будет:

Читать еще:  Метод abs java

Если Вы планируете создавать списки целочисленных или дробних значений — нужно воспользоваться классами обертками примитивных типов:

Отдельно я хочу показать как обходить ArrayList и выводить его значения.

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

Это все, что я хотел показать по теме работы с ArrayList. Когда Вы начнете использовать данный вид коллекции — примеры выше помогут разобраться на начальных этапах. Дальше, их использование будет интуитивным и понятным.

Метод ArrayList.toArray() в Java

Мне интересно, почему они разработали метод toArray в ArrayList для ввода ввода массива в Java?

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

Мой вопрос, почему они все еще нуждаются в массиве, который нужно передать? Спасибо.

7 ответов

13 Решение Andrzej Doyle [2012-03-26 17:37:00]

Две причины, о которых я могу думать:

  • Erasure означает, что общие параметры недоступны во время выполнения, поэтому ArrayList не знает, что он содержит строки, это просто тип raw ArrayList . Таким образом, все вызовы toArray() должны были бы вернуть a Object[] , что не является строго правильным. Вам нужно было бы создать второй массив String[] , а затем перебрать по первому, отбросив все его параметры, чтобы получить желаемый тип результата.
  • Способ определения метода означает, что вы можете передать ссылку на существующий массив и заполнить это методом. В некоторых случаях это, скорее всего, очень удобно, вместо того, чтобы возвращать новый массив и затем копировать его значения в другом месте.

В вашем коде ArrayList может содержать все, кроме строк. Вы можете переписать код на:

Однако в массивах Java содержится их тип содержимого (String) во время выполнения, в то время как генераторы стираются компилятором, поэтому система времени выполнения все еще не знает, что она должна создать String[] в вашем коде.

Вам нужно получить типы массивов, отличные от Object[] . listArray.toArray(new String[3]) на самом деле не нуждается в приведении в String[] , но он позволяет записывать в массивы для определенных типов, а не (довольно небезопасный) подход просто отличить Object[] к вашему типу.

0 Churk [2012-03-26 17:36:00]

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

Прочитайте второй абзац javadoc: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html#toArray (T [])

Не обязательно передавать Array в качестве аргумента toArray(), вы можете напрямую вызвать arrayList.toArray()

Как мы знаем, структура Collection с дженериками работает с концепцией Тип Erasure. Таким образом, arrayList становится списком Object, поэтому при преобразовании в массив он даст Object [], если вы не передадите какой-либо аргумент.

ArrayList не имеет достаточной информации, учитывая, что сам «данные» хранится в ведрах массивов Object . Итак, если вы знаете «какие» элементы, которые у вас есть в списке массивов, вы можете добиться безопасности типа, используя этот вариант метода toArray .

Поскольку массив, в который должны быть скопированы элементы, должен быть указан в JVM.

метод — toarray() java

Обобщения Java в ArrayList.toArray() (6)

Скажем, у вас есть arraylist, определенный следующим образом:

Позже в вашем коде из-за обобщений вы можете сказать это:

И компилятор сразу знает, что он получит строку. Yay дженерики! Однако это не удастся:

toArray() всегда будет возвращать массив объектов, а не общий, который был определен. Почему метод get(x) знает, что он возвращает, но по умолчанию toArray() значение Objects?

Я могу и буду использовать итератор вместо создания массива, но это всегда казалось мне странным. Почему метод get (x) знает, что он возвращает, но по умолчанию toArray () имеет значение Objects? Это как на полпути в разработке, они решили, что это не нужно здесь ??

Поскольку цель вопроса, похоже, заключается не только в том, чтобы обойти использование toArray() с обобщениями, но и в понимании дизайна методов в классе ArrayList , я хотел бы добавить:

Читать еще:  Как сделать игру на javascript

ArrayList является универсальным классом, так как он объявлен как

что позволяет использовать общие методы, такие как public E get(int index) внутри класса.

Но если метод, такой как toArray() , не возвращает E , а скорее E[] тогда все становится немного сложнее. Было бы невозможно предложить такую ​​подпись, как public E[] toArray() потому что невозможно создать универсальные массивы.

Создание массивов происходит во время выполнения, и из-за стирания типа среда выполнения Java не имеет конкретной информации о типе, представленном E Единственный обходной путь на данный момент — передать требуемый тип в качестве параметра методу и, следовательно, подписи public T[] toArray(T[] a) где клиенты вынуждены передавать требуемый тип.

Но, с другой стороны, он работает для public E get(int index) потому что если вы посмотрите на реализацию метода, вы обнаружите, что, хотя метод использует тот же массив Object для возврата элемента по указанному индекс, приведен к E

Это компилятор Java, который во время компиляции заменяет E на Object

Если вы посмотрите на Javadoc для интерфейса List , вы заметите вторую форму toArray : T[] toArray(T[] a) .

На самом деле, Javadoc даже дает пример того, как делать именно то, что вы хотите сделать:

String[] y = x.toArray(new String[0]);

Массив имеет другой тип, чем тип массива. Это своего рода класс StringArray вместо класса String.

Предполагая, что это возможно, универсальный метод toArray() будет выглядеть так:

Теперь во время компиляции тип T стирается. Как заменить new T[length] деталь new T[length] ? Информация об общем типе недоступна.

Если вы посмотрите на исходный код (например) ArrayList , вы увидите то же самое. Метод toArray(T[] a) либо заполняет данный массив (если размер совпадает), либо создает новый новый массив, используя тип параметра, который является типом массива универсального типа T.

Можно создать «универсальный» массив заданного (известного) типа. Обычно я использую что-то подобное в моем коде.

Первое, что вам нужно понять, это то, что ArrayList — это просто массив Object

Когда дело доходит до причины сбоя T[] , это потому, что вы не можете получить массив универсального типа без Class и это потому, что стирание типа Java ( есть более подробное объяснение и как его создать ) , И array[] в куче динамически знает его тип, и вы не можете привести int[] к String[] . По той же причине вы не можете привести Object[] к T[] .

Но то, что вы помещаете в array это просто объект, тип которого E (который проверяется компилятором), так что вы можете просто привести его к E что безопасно и правильно.

Короче говоря, ты не можешь получить то, чего не имеешь. У вас есть только Object[] , поэтому toArray() может просто вернуть Object[] (в противном случае вы должны дать ему Class чтобы создать новый массив с этим типом). Вы помещаете E в ArrayList , вы можете получить E с помощью get() .

Следует отметить, что массивы в Java знают тип своих компонентов во время выполнения. String[] и Integer[] — это разные классы во время выполнения, и вы можете запрашивать массивы для их типа компонента во время выполнения. Следовательно, тип компонента необходим во время выполнения (либо путем жесткого кодирования типа компонента reifiable во время компиляции с new String[. ] , либо с помощью Array.newInstance() и передачи объекта класса) для создания массива.

С другой стороны, аргументы типа в обобщениях не существуют во время выполнения. ArrayList время выполнения нет абсолютно никакой разницы между ArrayList и ArrayList . Это все просто ArrayList .

Это фундаментальная причина, по которой вы не можете просто взять List и получить String[] не передавая тип компонента отдельно — вам придется получать информацию о типе компонента из того, что не имеет тип компонента Информация. Понятно, что это невозможно.

toArray method of List with runtime type of the objects in the List

When using javax.mail.Message#setRecipeints , I noticed a thing for the first time and wanted to know more about it.

This is my code:

Here I am not getting why do we require to create a new InternetAddress array and pass the element at 0th index in the toArray method?

Can anyone explain why do we require this to be done?

I think it has something to do with this special toArray method.

Читать еще:  Метод format java

I read the following from the API docs but didn’t get the last part (in bold) :

Like the toArray() method, this method acts as bridge between array-based and collection-based APIs. Further, this method allows precise control over the runtime type of the output array, and may, under certain circumstances, be used to save allocation costs.

How does it save allocation costs?

Создан 12 фев. 13 2013-02-12 13:02:36 Abubakkar

You are not passing the 0th element, you are allocating a new array of length zero, and passing that. – jalynn2 12 фев. 13 2013-02-12 13:11:25

but why do we need to do that, can’t we simply pass the class name instead of creating array object – Abubakkar 12 фев. 13 2013-02-12 13:41:55

4 ответа

toArray() without parameter returns type of Object but toArray(T[] a) returns type of T[] . This is a generic method of List.

Создан 12 фев. 13 2013-02-12 13:17:35 cielorosso

Yes I know that, but why do we need that array there, can’t we pass the class name only? – Abubakkar 12 фев. 13 2013-02-12 13:39:54

@Abu see my answer, it uses the array you pass in if it is large enough. – Windle 12 фев. 13 2013-02-12 13:52:45

yes I know that, but I want the reason why do we do that, can’t it infer from the class name that we can provide to the method – Abubakkar 12 фев. 13 2013-02-12 13:55:17

@Abu Because it gives you the option to reuse an existing array rather than make a new one. If the only option was to pass in the class name, the method would **have to** create a new array every time. By letting you pass in an array, you have more flexibility and are able to allocate space once, and then copy lists into the array multiple times. – Windle 12 фев. 13 2013-02-12 14:20:34

Here is the source for the ArrayList.toArray() method you are using:

First off, you aren’t passing in a reference to index 0, but a new array of length 0. Assuming your list isn’t empty, the new zero length array will be too small to hold it, and a new array of the correct type is created: Arrays.copyOf(elementData, size, a.getClass());

You could pass in an array that was large enough to hold the entire list, and then the list would be copied into the array you provided: System.arraycopy(elementData, 0, a, 0, size); As to whether this will save you allocation costs, it’s hard to say. System.arraycopy() is native a method, i.e. platform dependent. Without seeing the code it uses you just have to rely on the fact that native implementations should be more efficient in general and trust that the JVM writers know what they are doing.

Создан 12 фев. 13 2013-02-12 13:19:00 Windle

The argument to the method is an array that may receive the contents of the Collection, if it is big enough. I think that circumstances would be if you already had an array allocated that was large enough to hold the collection, that same array could be used instead of allocating a new one.

Note that your code is passing an array of length 0 — that array will be returned only when the collection is empty. If there are any items in the List, a new array will be allocated and returned.

Создан 12 фев. 13 2013-02-12 13:19:09 jalynn2

To use it to save allocation costs the array argument has to be at least as long as the List. In that case, the data is copied into the array referenced by the argument. Suppose the List is always the same size, you always want it to be the same element type, and you only need one array at a time. You could reuse the same array, rather than creating a new on each time toArray is called.

In practice, it is more usual to create a new array each time, but if you use the List size rather than 0 toArray will be able to use it.

Ссылка на основную публикацию
Adblock
detector