【问题标题】:What does it mean when I assign an instance of a class to an interface variable?当我将类的实例分配给接口变量时,这意味着什么?
【发布时间】:2019-01-03 22:39:28
【问题描述】:

我想知道是否:

List<String> s = new ArrayList<String>()

是一个使用列表方法的列表,但它是用 ArrayList 构建的?

它的行为是什么?

我无法完全理解我是用这段代码创建队列还是链接列表,

Queue q = new LinkedList();

【问题讨论】:

    标签: arrays list arraylist


    【解决方案1】:

    ArrayList 实现了 List 接口。类似地,LinkedList 实现了 Queue 接口。这意味着:

    • ArrayList 已承诺它将拥有所需的所有方法 表现得像一个列表
    • LinkedList 承诺它将拥有像队列一样运行所需的所有方法

    因为这两个类都实现了这些承诺(它们实现了接口),Java 可以将 ArrayList 视为 List。同样,它可以将 LinkedList 视为队列。

    您为什么要这样做?您可能希望能够将任何 List 传递到您的代码中——您并不关心它是如何实现的。因此,您可能有一个 HugeSparseList,它也实现了完全不同地存储底层对象的 List。这对您的代码无关紧要 - 只要 API 相同,您的代码仍然可以工作。

    【讨论】:

    • 那么如果我们创建这样的东西,List l = new ArrayList();意思是不能调用数组列表的方法,只能调用列表接口上的方法?
    • 没错,您承诺将对象视为 List - 因此您的代码将不依赖于其底层实现,只是它具有与 List 相同的行为这一事实。
    【解决方案2】:

    List 是表示元素序列的基类。 Array List 是一种特殊的实现,它使用内部数组并在需要时动态分配空间。 链表是使用从一个节点指向下一个节点的指针存储的一系列元素。

    这两种数据结构在计算复杂度、内存需求和速度方面是不同的。 您可以找到更多信息here

    【讨论】:

      猜你喜欢
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 2018-02-02
      • 2017-03-27
      • 2021-03-31
      相关资源
      最近更新 更多