Ответ 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
.