Groovy - Разница между списком, ArrayList и массивом объектов

Я пытался понять разницу между groovy List, ArrayList и Object Array но не смог найти реальные (простые) примеры. Например, что мы можем сделать с Array, чего нельзя сделать с помощью List или ArrayList? Я понимаю, что Array - это фиксированная последовательность объектов. Просто упомянуть, что я смотрел на это, это и это в Java и пытался понять пункты, упомянутые там.

Я надеюсь, что я описываю свою проблему ясно, но дайте мне знать, если я не ясен или полностью упускаю суть. Может ли кто-нибудь указать мне правильное направление? Благодарю вас!

Ответ 1

Да, Array - это структура данных с фиксированным размером. Он объявлен как имеющий тип, который описывает, какие элементы он может содержать, этот тип является ковариантным (см. Здесь ковариантный или контравариантный элементы). Array знает свой тип во время выполнения, и попытка поместить что-либо неподходящее в Array приведет к исключению.

В Groovy массивы не совсем идиоматичны из-за низкого уровня и негибкости (фиксированного размера). Они поддерживаются для взаимодействия с Java. Обычно люди, использующие Groovy, предпочитают List Array. Groovy пытается сгладить различия, например, вы можете использовать метод size в Array для получения количества элементов (даже если в Java вам придется использовать свойство length).

(В Ruby структура данных, наиболее близкая к списку, называется Array, поэтому люди, приходящие в Groovy или Grails из Rails без фона Java, имеют тенденцию переносить номенклатуру, что приводит к путанице.)

java.util.List - это интерфейс, описывающий основные операции над списками, которые реализуются различными видами списков. Списки используют параметры универсального типа для описания того, что они могут содержать (типы являются необязательными в Groovy). Списки не являются ковариантными из-за стирания типа. Общие коллекции полагаются на компилятор для обеспечения безопасности типов.

В Groovy, когда вы создаете список с использованием буквального синтаксиса (def mylist = []), java.util.ArrayList - это реализация, которую вы получаете:

groovy:000> list = ['a', 'b', 'c']
===> []
groovy:000> list instanceof List
===> true
groovy:000> list.class
===> class java.util.ArrayList
groovy:000> list.class.array
===> false
groovy:000> list << 'd'
===> [d]
groovy:000> list[0]
===> a

Чтобы создать массив, вы должны добавить as (type)[] в объявление:

groovy:000> stringarray = ['a', 'b', 'c'] as String[]
===> [a, b, c]
groovy:000> stringarray.class
===> class [Ljava.lang.String;
groovy:000> stringarray.class.array
===> true
groovy:000> stringarray << 'd'
ERROR groovy.lang.MissingMethodException:
No signature of method: [Ljava.lang.String;.leftShift() is applicable 
for argument types: (java.lang.String) values: [d]
groovy:000> stringarray[0]
===> a

Уже есть несколько вопросов, ArrayList против LinkedList и когда использовать LinkedList<> поверх ArrayList<>? , которые охватывают различия между LinkedList и ArrayList.

Ответ 2

Вы можете найти различия между ArrayList и LinkedList, это реализация List (interface). Каждая реализация имеет разные методы. Вы можете увидеть эти методы в:

* Методы LinkedList

* Методы ArrayList

Список нельзя сравнивать с ArrayList.

Ответ 3

List - это интерфейс и ArrayList реализация с определенными характеристиками. Как и во всех других языках программирования, Java также имеет определенные контейнеры для проблем с сертификатами. Вы можете получить начальное понимание здесь: http://docs.oracle.com/javase/1.5.0/docs/guide/collections/overview.html