Groovy- List、ArrayList 和 Object Array 之间的区别

2022-09-02 21:07:25

我试图了解时髦之间的区别,但找不到真实(简单)的例子。比如,我们可以用 什么来做,而不能用 或 来完成?我知道数组是一个固定的对象序列。只是要提到我已经在java中看过这个这个这个,并试图理解那里提到的要点。ListArrayListObject ArrayArrayListArrayList

我希望我清楚地描述了我的问题,但是如果我不清楚或完全错过了重点,请告诉我。有人能给我指出正确的方向吗?谢谢!


答案 1

是的,是具有固定大小的数据结构。它被声明为具有描述它可以容纳的元素的类型,该类型是协变的(请参阅此处的协变与逆变)。在运行时知道其类型,并尝试在 中放入任何不适当的内容将导致异常。ArrayArrayArray

在Groovy中,数组并不是真正的惯用语,因为它是低级和不灵活的(固定大小)。它们支持与 Java 进行互操作。通常使用Groovy的人更喜欢.Groovy确实试图消除差异,例如,您可以在上使用的方法获取元素的数量(即使在Java中您必须使用该属性)。ListArraysizeArraylength

(在Ruby中,最接近列表的数据结构被称为,所以没有Java背景的Rails来到Groovy或Grails的人倾向于继承命名法,从而导致混乱。Array

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<>?,它们涵盖了 和 之间的区别。LinkedListArrayList


答案 2

您可以找到 和 之间的差异,这些是 (接口) 的实现。每个实现都有不同的方法。您可以在以下位置看到这些方法:ArrayListLinkedListList

*方法链接列表

*方法数组列表

列表不能与 ArrayList 进行比较。