字典困境:数组与Arraylist

时间:2013-01-01 00:31:23

标签: java arrays eclipse arraylist

我想知道的是哪一个更有效率,我应该使用一维数组并列出100个单词,还是使用数组列表在Java中做同样的事情?

注意:到目前为止我只使用了数组,数组列表对我来说有点新,我知道它是什么,我以前从未使用它,它们也会被用来随机选择一个单词。

3 个答案:

答案 0 :(得分:2)

如果从头开始知道元素的最终数量,那么就没有必要在Array上使用ArrayList。 ArrayList是动态的:它们可以增长,但是在性能和​​内存空间要求方面你需要付出很小的代价。差异很小但如果你不需要ArrayList的自动增长功能那么为什么要求呢?

然而,除此之外,还有一些标准可以使(或不是)更大的启动:数组是协变的,其中ArrayList不是;也就是说:如果B是A的子类,则对A的数组的引用也可以接受对B数组的引用,但是对A的ArrayList的引用不能接受B的ArrayList。换句话说,一个数组B将被视为A的数组的协变,但A的ArrayList不会:

class A {}
class B extends A {}

A[] a = new B[1];  // OK
ArrayList<A> a2 = new ArrayList<B>();  // Error.

要绕过最后一个错误,您可以尝试一系列类型,例如:

ArrayList<? extends A> a3 = new ArrayList<B>();

但是,你正在限制ArrayList a3的逆变:

a3.add(new A());  // Error!
a3.add(new B());  // Error again!

但是,当你有一个类的层次结构时,继续使用超类通常是一个更好的主意。因此,即使你有一组对象B,其中B是A的子类,保持A []和ArrayList而不是B []和ArrayList来保持对这些对象的引用B通常更适合OOP并且更容易使用

有时候,您可能需要从A到B进行转换才能访问A无法从A访问的属性或B方法。但是,这可能被视为设计中的一个弱点。当您在最大程度上使用多态时,OOP最有效,并且基类(或超类)应该具有访问所有子类的属性和方法的所有必需的虚函数,因此您应该能够保持对子类的引用使用基类而不必在其后进行任何演员。

答案 1 :(得分:1)

我建议您使用List,基于性能的数组和列表之间几乎没有这种差异。

但是在List的情况下,与数组相比,您的代码将易于管理和灵活。

答案 2 :(得分:0)

如果效率是你最大的担忧,那你就不用担心了。使用您想要的任何一个。对于99.99%(完全组成)的应用程序,您将看到阵列与List之间的性能没有明显差异。通常,列表比阵列更受欢迎,因为它们更易于使用。