什么是List与ArrayList?
这两个对象之间的根本区别是什么? 一个更有效率? 有没有更多的方法?
List在接口中,而ArrayList是一个类。
请参见ArrayList和List 。
例如,您无法使用此设置:
List
…因为它是一个界面。
但是,这有效:
ArrayList
另外……你可以像下面的duffymo那样做,这或多或少与实现List
接口相同(制作你自己的列表实现)。
考虑如下所示的行:
List names = new ArrayList ();
如果您是面向对象体系结构的新手,您可能希望看到像ArrayList
。 毕竟,你刚才说它是一个新的ArrayList
,所以你不应该把它存储在ArrayList
类型的变量中吗?
嗯,你当然可以做到这一点。 但是, List
是一个接口 – 就像一个类型的模板 – 据说ArrayList
inheritance。 这是一份合同,上面写着“无论何时使用List
实现,您都可以期待这些方法可用”。 在List
的情况下,方法是add
, get
等。
但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的其他实现,是Polymorphism
和Inheritance
,以及使用Java等语言的原因。
简单来说,多态性是多种forms,而inheritance是重用。
可以有多种具体的,可供我们使用的List,例如ArrayList, Vector
, LinkedList
和Stack
。 决定使用哪个来自你,如果你看一下List API ,你会发现所有这些List实现都以一种方式从List扩展。
根据java文档 ,List只是一个接口,而ArrayList是实现它的类之一。 使用ArralyList而不是对ArrayList对象的List类型引用没有固有的效率优势。
但是,当谈到“效率”时,List接口的不同实现之间可能存在差异。 例如,LinkedList和ArrayList之间的效率差异很小,具体取决于您使用它们的方式。
要引用ArrayList页面上的java文档,
添加操作以分摊的常量时间运行,即添加n个元素需要O(n)时间。 所有其他操作都以线性时间运行(粗略地说)。 与LinkedList实现相比,常数因子较低。
换句话说,性能差异可能可以忽略不计,但您可能会看到使用ArrayList(而不是LinkedList)的一些优势。
如果您感兴趣,ArrayList是使用不时resize的数组实现的(很可能每当您的集合大小翻倍时),这与LinkedList的实现完全不同(有关详细信息,请参阅维基百科)。