我想知道哪个更有效,我应该使用一维数组并列出 100 个单词,还是制作一个数组列表在 Java 中做同样的事情?
注意:到目前为止我只使用过数组,数组列表对我来说有点新,我知道它是什么,我以前从未使用过它,它们也将用于随机选择一个单词。
如果您从一开始就知道元素的最终数量,那么在 Array 上使用 ArrayList 是没有意义的。ArrayList 是动态的:它们可以增长,但就性能和内存空间要求而言,您需要付出很小的代价。区别很小,但是如果您不需要自动增长功能,ArrayList
那么为什么要要求它呢?
然而,除此之外,还有另一个标准可以(或不)引起更大的轰动:数组是协变的,而 ArrayList 不是;也就是说:如果 B 是 A 的子类,那么对 A 的 Array 的引用也可以接受对 B 的数组的引用,但对 A 的 ArrayList 的引用不能接受 B 的 ArrayList。换句话说, B 将被视为 A 的 Array 的协变,但 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 无法访问的 B 的属性或方法。但是,这可能被视为设计中的一个弱点。当您在最大程度上使用多态性并且基类(或超类)应该具有所有必要的虚函数来访问所有子类的属性和方法时,OOP 效果最好,因此您应该能够保留对子类的引用使用基类而无需在此后进行任何转换。
我建议你使用List
,基于性能的数组和列表之间几乎没有这种区别。
但是如果List
您的代码与数组相比将易于管理和灵活。
如果效率是您在这里最大的担忧,那么您就没有后顾之忧。使用任何你想要的。对于 99.99%(完全组成)的应用程序,您会发现数组和列表之间的性能没有明显差异。一般来说,列表比数组更受欢迎,因为它们更容易使用。