LinkedList和ArrayList的实现有什么不同?

22 浏览
0 Comments

LinkedList和ArrayList的实现有什么不同?

这个问题已经有了答案:

可能重复:

何时使用LinkedList<>而不是ArrayList<>?

我看了一下ArrayList和LinkedList的API,它们似乎是相同的。除了它们的性能差异外,在添加、删除和迭代列表方面有什么区别吗?

List arrList = new ArrayList();
List linList = new LinkedList();

列表arrList或linList的引用实际上实现了相应的类。这到底意味着什么?

admin 更改状态以发布 2023年5月23日
0
0 Comments

我不完全确定你在问“这到底意味着什么?”时想要表达什么,但是我猜是这样的。

考虑这样的代码:

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”方法。

因此,在你的例子中,List接口中的任何方法都可以被arrList和linList两个对象访问,但它们提供的除了List接口之外的任何方法都不能在没有强制转换的情况下被调用。你可以(在大多数情况下应该)将ArrayList和LinkedList都视为List。

关于从不同的列表中插入/添加/删除的具体细节,你通常不需要关心。从最终结果的角度来看,它们都以相同的方式运行(例如,使用相同的数据调用相同的方法序列将导致相同的结果,只是内部布局不同)。

0
0 Comments

就你的第一个问题而言:它们的性能和内存使用是对你有影响的唯一区别(第三个问题,它们的实际实现细节不是你所关心的。)LinkedList使用更多的内存,从头开始遍历列表以获取第22个元素非常慢;但是在列表中间添加和删除元素非常出色。 ArrayList使用更少的内存,并且获取第22个元素非常快,但在列表中插入或删除元素需要与列表大小成比例的时间。

就你的第二个问题而言:引用实际上“实现了列表”这个说法是不正确的,所以我不知道该如何回答。引用变量引用实现了List接口的对象;这两个类都实现了该接口,因此类型为List的引用可以引用任何一个类的对象。

0