我希望了解groovy List
,ArrayList
和Object Array
之间的区别,但找不到真实(简单)的例子。比如,我们可以使用Array
做什么,List
或ArrayList
无法做到?我知道Array是一个固定的对象序列。只是要提一下,我在java中查看了this,this和this,并尝试了解那里提到的要点。
我希望我能清楚地描述我的问题,但如果我不清楚或完全忽略这一点,请告诉我。有人能指出我正确的方向吗?谢谢!
答案 0 :(得分:13)
是的,数组是具有固定大小的数据结构。它被声明为具有描述它可以容纳哪些元素的类型,该类型是协变的(see here for covariant vs contravariant)。数组在运行时知道它的类型,并且尝试在数组中放置任何不适当的东西都会导致异常。
在Groovy数组中由于低级且不灵活(固定大小)而不是真正的惯用,它们支持与Java的互操作。通常,使用Groovy的人更喜欢列表而不是数组。 Groovy确实试图消除差异,例如你可以在数组上使用size方法来获取元素的数量,即使在Java中你也需要 使用长度属性。
(在Ruby中,与列表最相似的数据结构称为Array,因此从没有Java背景的Rails进入Groovy或Grails的人往往会因为混乱而继续使用命名法。)
java.util.List是一个接口,它描述了由不同类型的列表实现的基本列表操作。列表使用泛型类型参数来描述它们可以容纳的内容(在Groovy中类型是可选的)。由于类型擦除,列表不协变。通用集合依赖于编译器来强制执行类型安全。
在使用文字语法(def mylist = []
)创建列表时,在Groovy中,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之间的差异。
答案 1 :(得分:4)
您可以找到ArrayList
和LinkedList
之间的差异,这些是List
(接口)的实现。每个实现都有不同的方法。您可以在以下位置查看这些方法:
列表无法与ArrayList进行比较。
答案 2 :(得分:1)
List
是一个接口,ArrayList
是具有某些特征的实现。与所有其他编程语言一样,Java也有某些容器可以解决某些问题。你可以在这里初步掌握:http://docs.oracle.com/javase/1.5.0/docs/guide/collections/overview.html