这两个对象有什么根本区别?一个更有效率?有没有更多方法?
答案 0 :(得分:24)
List在接口中,而ArrayList是一个类。
例如,您无法使用此设置:
List<String> list = new List<String>();
...因为它是一个界面。
然而,这有效:
ArrayList<String> arrayList = new ArrayList<String>();
另外......你可以像下面的duffymo那样做,这与实现List
接口(制作你自己的列表实现)大致相同。
答案 1 :(得分:19)
考虑以下几行:
List<String> names = new ArrayList<String>();
如果您是面向对象体系结构的新手,您可能希望看到类似ArrayList<String> names = new ArrayList<String>();
的内容。毕竟,你刚才说它是一个新的ArrayList
,所以你不应该把它存储在ArrayList
类型的变量中吗?
嗯,你当然可以做到。但是,List
是一个接口 - 就像一个类型的模板 - 据说ArrayList
继承。这是一份合同,上面写着“无论何时使用List
实施,您都可以期待这些方法可用”。对于List
,方法类似于add
,get
等。
但ArrayList
只是List
的一个实现。还有其他人,例如LinkedList
。两者具有相同的界面,并且可以以相同的方式使用,但在幕后工作方式非常不同。其中ArrayList
是“随机”访问,意味着它直接找到数组的特定元素而不遍历整个列表,LinkedList
必须从第一个元素开始并逐个进行直到它到达你需要的元素。
问题是,虽然您确实需要在创建对象时指定所需的内容,但通常只需要进行通信,而不仅仅是List
这样的事实,所以您只需要说它是什么是。 List
表示您有一个集合,该集合旨在按照给定的顺序。如果您不需要那么多的沟通,您可以考虑将其作为Collection
传递,这是另一个接口(List
的超级接口)。或者,如果你需要沟通的只是你可以迭代它,你甚至可以称之为Iterable
。
答案 2 :(得分:13)
列表是一个界面; ArrayList是一个实现List接口的类。
接口定义了所需的方法签名,但没有说明它们是如何实现的。
实现接口的类承诺提供具有接口声明的相同签名的方法的公共实现。
答案 3 :(得分:2)
List
定义ArrayList
使用的接口,允许它实现允许实现List的所有其他类一起使用或以类似方式使用的方法。 ArrayList
始终为List
,但List
不一定是ArrayList
。
也就是说,ArrayList
实现List
(在其他几个接口中)。
答案 4 :(得分:1)
如何使用List和ArrayList
或List的其他实现,Polymorphism
和Inheritance
,以及使用Java等语言的原因。
简单来说,多态性是多种形式,而继承是重用。
您可以使用多种具体和准备好的列表,例如ArrayList,Vector
,LinkedList
和Stack
。决定使用哪个来自你,如果你看一下List API,你会注意到所有这些List实现都以一种方式从List扩展。
答案 5 :(得分:0)
根据java docs,List只是一个接口,而ArrayList是实现它的类之一。使用ArralyList而不是对ArrayList对象的List类型引用没有固有的效率优势。
然而,当谈到“效率”时,List接口的不同实现之间可能存在差异。例如,LinkedList和ArrayList之间的效率差异很小,具体取决于您使用它们的方式。
引用ArrayList页面上的java文档,
添加操作以分摊的常量时间运行,即添加n个元素需要O(n)时间。所有其他操作都以线性时间运行(粗略地说)。与LinkedList实现相比,常数因子较低。
换句话说,性能差异可能可以忽略不计,但您可能会看到使用ArrayList(而不是LinkedList)的一些优势。
如果您感兴趣,ArrayList是使用不时调整大小的数组实现的(很可能每当您的集合大小翻倍时),这与LinkedList的实现完全不同(有关详细信息,请参阅维基百科)