我看到了ArrayList和LinkedList的API,它看起来是一样的。除了它们的性能差异之外,在添加,删除和迭代List方面存在任何差异。
List arrList = new ArrayList();
List linList = new LinkedList();
List arrList or linList
引用实际上是在实现相应的类。这究竟意味着什么?
答案 0 :(得分:3)
就你的第一个问题而言:他们的表现和内存使用情况时,唯一与你无关的差异(第三个,他们的实际实施细节,不是你的担忧。)LinkedList
使用更多记忆,从头部走过列表得到第22个元素是非常缓慢的;但就添加和删除列表中间的元素而言,它们非常棒。 ArrayList
使用更少的内存,获得第22个元素的速度非常快 - 但在中间插入或删除元素需要的时间与列表的大小成正比。
就你的第二个问题而言:引用“实际实现列表”的陈述是错误的,所以我真的不知道如何回答它。引用变量是指实现List
接口的对象;这两个类都实现了该接口,因此类型List
的引用可以引用任一类的对象。
答案 1 :(得分:2)
当你问“这究竟是什么意思?”时,我不是100%肯定你的意思,但这是一个猜测。
考虑这样的代码:
interface Interface
{
void foo();
}
class Implementation
implements Interface
{
public void foo() { }
public void bar() { }
}
public class Main
{
public static void main(final String[] argv)
{
Interface a;
Implementation b;
a = new Implementation();
b = a;
a.foo();
b.foo();
a.bar(); <- won't compile
b.bar();
}
}
接口a;和实施b;两者都指向同一个对象,但只有对“b”的引用才能访问“bar”方法。
因此,在您的示例中,arrList和linList都可以访问List接口中的任何方法,但除了List接口之外,它们提供的任何方法都不能在没有强制转换的情况下调用。您可以(并且在大多数情况下)将ArrayList和LinkedList视为List。
对于从不同列表中插入/添加/删除的细节,您通常不应该关心。从最终结果的角度来看,两者的行为方式相同(例如,使用相同数据的相同方法调用序列将产生相同的结果,只是内部布局会有所不同)。
答案 2 :(得分:1)
在Java教程中对这两个List实现的优缺点进行了很好的讨论。请参阅List Implementations上的主题。
答案 3 :(得分:0)
ArrayList
由数组支持,该数组在需要时调整大小。 LinkedList
由元素节点组成,其引用指向上一个节点和下一个节点。这个网站上有很多帖子讨论差异,只是搜索它们。