8

为什么Queue是接口,而StackArrayList等其他接口是类?

我知道接口的制作是为了让客户可以实现它们并添加他们自己的方法,而对于类,如果每个客户都需要他们的方法,那么它会变得巨大而臃肿..

...或者我在这里错过了什么?

4

5 回答 5

7

AQueue可以以多种方式实现,aList或 a也可以Set。他们都只是为不同类型的集合指定了一个合同。

然而, anArrayList是 a 的特定实现,用于List在内部使用数组来存储元素。LinkedList也是 a 的一种实现List,它使用一系列相互连接的节点,即双向链表。同样,TreeSetHashMap分别是集合和映射的特定实现。

现在,Stack这是一个奇怪的情况,特别是因为它是旧版本 Java 的遗留类。你真的不应该再使用 aStack了;相反,您应该使用它的现代等价物ArrayDeque. ArrayDeque是一个Deque(双端队列)的实现,它在内部使用一个数组进行存储(这正是Stack它的作用)。ADeque支持 a Stack,like pop,等的所有操作。 includepush的其他实现,正如其他人所提到的,虽然这偏离了底层它不是一个数组,而是一个双向链表:-pDequeLinkedListStack

现在,有很多 s 的实现Queue,以及许多不同类型的Queues。你不仅有BlockingQueues(通常用于生产者-消费者),它的常见实现包括LinkedBlockingQueueand ArrayBlockingQueue,还有TransferQueues 等等。我离题了...您可以在相关的Java 教程中阅读有关集合 API 的更多信息。

于 2012-09-02T18:42:25.130 回答
3

你正确地理解了接口的概念。在这种情况下,Java 标准库已经提供了实现和接口。您最好使用接口,以便您可以随时切换实现。

希望这是有道理的。

于 2012-09-02T18:40:37.083 回答
0

我认为Stack作为一个应该是接口的类而闻名。在正确选择提供接口时,Java 库有点失败。

ArrayList只是List接口的一个实现,所以 Sun 在那里得到了它的正确性!另一个经典的失误(在我看来)是Observable类,它非常需要成为接口的默认实现,而不仅仅是一个类。

于 2012-09-02T18:41:57.763 回答
0

有趣的问题。我认为这Queue是许多数据结构(如 BlockingQueue、PriorityQueue、Deque 等)的基础。这些类需要针对各种操作进行特定实现,因此将其制作Queue为接口要简单得多。

于 2012-09-02T18:46:11.457 回答
0

接口用于 List 和 Queue 的原因不是为了减少过多的代码。

接口的主要优点是它们允许您编写灵活、松散耦合的代码。

(这是一个很棒的答案,完美地描述了这个概念)

接口只是定义了一个类将要实现的方法列表。

这使我们能够做一件非常强大的事情:

  • 我们可以将所有实现接口的类视为相同。

这是一个巨大的优势。

这是一个非常简单的例子:

我们想编写一个调试方法来打印Collection中的每个元素。

集合是一个接口。它定义了一个操作列表并且不实现它们。

不能实例化集合。您可以实例化一个实现 Collection 的类。

实现Collection的类有很多:ArrayList、Vector、TreeSet、LinkedList 等......它们都有不同的时髦特性,但它们有一些共同点:因为每个类都实现了 Collection ,所以它们都实现了这里的每个方法。

这让我们可以做一件非常强大的事情:

  • 我们可以编写一个对实现 Collection的任何类进行操作的方法。

它看起来像这样:

public void printCollection(Collection semeCollection) {
    for (Object o : someCollection) {
       String s = (o == null) ? "null" : o.toString(); 
       System.out.println(s);
    }
}

由于接口的魔力,我们现在可以执行以下操作:

public void testStuff() {

    Collection s = new TreeSet();
    Collection a = new ArrayList();
    Collection v = new Vector();

    s.add("I am a set");
    a.add("I am an array list");
    v.add("I am a vector");

    printCollection(s);
    printCollection(a);
    printCollection(v);
}
于 2012-09-02T19:39:25.777 回答