gpt4 book ai didi

java - 字典困境 : Array vs Arraylist

转载 作者:行者123 更新时间:2023-12-02 00:04:37 25 4
gpt4 key购买 nike

我想知道哪一个更有效,我应该使用一维数组并列出 100 个单词,还是制作一个数组列表在 Java 中执行相同的操作?

注意:到目前为止我只使用过数组,数组列表对我来说有点陌生,我知道它是什么,我只是以前从未使用过它,而且它们还可以用来随机选择一个单词。

最佳答案

如果您从一开始就知道元素的最终数量,那么使用 ArrayList 而不是 Array 是没有意义的。 ArrayList 是动态的:它们可以增长,但在性能和内存空间需求方面您只需付出很小的代价。区别很小,但如果您不需要 ArrayList 的自动增长功能,那为什么还要要求它呢?

然而,除此之外,还有另一个标准可以引起(或不引起)更大的轰动:数组是协变的,而 ArrayList 不是;也就是说:如果 B 是 A 的子类,则对 A 的 Array 的引用也可以接受对 B 的数组的引用,但对 A 的 ArrayList 的引用不能接受 B 的 ArrayList。换句话说,对 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!

但是,当您具有类层次结构时,继续使用父类(super class)通常是一个更好的主意。因此,即使您有一组对象 B,其中 B 是 A 的子类,保留 A[] 和 ArrayList 而不是 B[] 和 ArrayList 来保留对这些对象 B 的引用通常更适合 OOP 并且更易于使用.

有时,您可能必须从 A 到 B 进行强制转换,才能访问 A 无法访问的 B 的属性或方法。但是,这可能被视为设计中的弱点。当您充分利用多态性时,OOP 效果最佳,并且基类(或父类(super class))应该具有所有必要的虚函数来访问所有子类的属性和方法,因此您应该能够保留对子类的引用使用基类,之后无需进行任何转换。

关于java - 字典困境 : Array vs Arraylist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14107047/

25 4 0