是的,Array 是一个固定大小的数据结构。它被声明为具有描述它可以容纳哪些元素的类型,该类型是协变的(see here for covariant vs contravariant)。 Array 在运行时知道它的类型,尝试在 Array 中放入任何不合适的内容将导致异常。
在 Groovy 中,由于低级且不灵活(固定大小),数组并不是真正的惯用方法。它们支持与 Java 的互操作。通常使用 Groovy 的人更喜欢 List 而不是 Array。 Groovy 确实试图消除差异,例如,您可以在 Array 上使用 size 方法来获取元素的数量(即使在 Java 中您必须
使用length 属性)。
(在 Ruby 中,与列表最相似的数据结构称为 Array,因此从 Rails 进入 Groovy 或 Grails 的人没有 Java 背景往往会沿用该命名法,从而导致混淆。)
java.util.List 是一个接口,描述了由不同种类的列表实现的基本列表操作。列表使用泛型类型参数来描述它们可以包含的内容(在 Groovy 中类型是可选的)。 Lists 上的泛型类型是不变的,而不是协变的。泛型集合依赖编译时检查来强制类型安全。
在 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 Vs LinkedList和When to use LinkedList<> over ArrayList<>?,涵盖了LinkedList和ArrayList之间的区别。