什么是List与ArrayList?

这两个对象之间的根本区别是什么? 一个更有效率? 有没有更多的方法?

List在接口中,而ArrayList是一个类。

请参见ArrayList和List 。

例如,您无法使用此设置:

List list = new List(); …因为它是一个界面。

但是,这有效:

ArrayList arrayList = new ArrayList();

另外……你可以像下面的duffymo那样做,这或多或少与实现List接口相同(制作你自己的列表实现)。

考虑如下所示的行:

 List names = new ArrayList(); 

如果您是面向对象体系结构的新手,您可能希望看到像ArrayList names = new ArrayList(); 。 毕竟,你刚才说它是一个新的ArrayList ,所以你不应该把它存储在ArrayList类型的变量中吗?

嗯,你当然可以做到这一点。 但是, List是一个接口 – 就像一个类型的模板 – 据说ArrayListinheritance。 这是一份合同,上面写着“无论何时使用List实现,您都可以期待这些方法可用”。 在List的情况下,方法是addget等。

ArrayList只是List一个实现。 还有其他的,比如LinkedList 。 两者具有相同的界面,并且可以以相同的方式使用,但在幕后工作方式非常不同。 其中ArrayList是“随机”访问,这意味着它直接找到数组的特定元素而不遍历整个列表, LinkedList必须从第一个元素开始并逐个进行,直到它到达您需要的元素。

问题是,虽然你确实需要在创建对象时指定你想要的东西,但你通常只需要传达它只是一个List的事实,所以你只需说它是什么。 List表示您有一个集合,该集合旨在按给定的顺序排列。 如果您不需要那么多的通信,您可以考虑将其作为Collection传递,这是另一个接口( List的超级接口)。 或者,如果你需要沟通的是你可以迭代它,你甚至可以称之为Iterable

List是一个接口; ArrayList是一个实现List接口的类。

接口定义了所需的方法签名,但没有说明它们是如何实现的。

实现接口的类承诺提供具有接口声明的相同签名的方法的公共实现。

List定义了ArrayList使用的接口,允许它实现允许实现List的所有其他类一起使用或以类似方式使用的方法。 ArrayList始终也是List ,但List不一定是ArrayList

也就是说, ArrayList实现了List (在其他一些接口中)。

如何使用List和ArrayList ,或List的其他实现,是PolymorphismInheritance ,以及使用Java等语言的原因。

简单来说,多态性是多种forms,而inheritance是重用。

可以有多种具体的,可供我们使用的List,例如ArrayList, VectorLinkedListStack 。 决定使用哪个来自你,如果你看一下List API ,你会发现所有这些List实现都以一种方式从List扩展。

根据java文档 ,List只是一个接口,而ArrayList是实现它的类之一。 使用ArralyList而不是对ArrayList对象的List类型引用没有固有的效率优势。

但是,当谈到“效率”时,List接口的不同实现之间可能存在差异。 例如,LinkedList和ArrayList之间的效率差异很小,具体取决于您使用它们的方式。

要引用ArrayList页面上的java文档,

添加操作以分摊的常量时间运行,即添加n个元素需要O(n)时间。 所有其他操作都以线性时间运行(粗略地说)。 与LinkedList实现相比,常数因子较低。

换句话说,性能差异可能可以忽略不计,但您可能会看到使用ArrayList(而不是LinkedList)的一些优势。

如果您感兴趣,ArrayList是使用不时resize的数组实现的(很可能每当您的集合大小翻倍时),这与LinkedList的实现完全不同(有关详细信息,请参阅维基百科)。