java.util包 - 类和接口

时间:2012-09-02 18:36:04

标签: java interface stack queue

为什么Queue是一个界面,但StackArrayList之类的其他类是什么?

我理解接口是这样的,客户端可以实现它们并添加自己的方法,而对于类,如果每个客户端都需要它们的方法,它将变得庞大而臃肿......

......或者我在这里遗漏了什么?

5 个答案:

答案 0 :(得分:7)

Queue可以通过多种方式实施,ListSet也是如此。他们都只是为不同类型的集合指定合同。

然而,ArrayListList的特定实现,用于在内部使用数组来存储元素。 LinkedList也是List的实现,它使用一系列互连节点,即doubly linked list。同样,TreeSetHashMap分别是集合和地图的特定实现。

现在,Stack在这里是一个奇怪的例子,特别是因为它是旧版Java的遗留类。你真的不应该再使用Stack;相反,你应该使用它的现代等价物ArrayDequeArrayDequeDeque(一个双端队列)的实现,它在内部使用数组进行存储(这正是Stack所做的)。 Deque支持Stack的所有操作,例如poppush等。Deque的其他实现包括LinkedList,如其他人提到的,虽然这与Stack不同,因为它不是一个数组,而是一个双向链表:-p

现在,有很多Queue的实现,以及许多不同类型的Queue。您不仅拥有BlockingQueue s(通常用于生产者 - 消费者),其常见实现包括LinkedBlockingQueueArrayBlockingQueue,还有TransferQueue s,依此类推。我离题了......你可以在相关的Java Tutorial中阅读有关集合API的更多内容。

答案 1 :(得分:3)

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

希望它有意义。

答案 2 :(得分:0)

我认为Stack因为是一个应该是界面的类而闻名。在正确选择提供接口方面,Java库有点昙花一现。

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

答案 3 :(得分:0)

有趣的问题。我想到Queue是许多数据结构的基础,比如BlockingQueue,PriorityQueue,Deque等。这一类需要针对各种操作进行特定的实现,因此将Queue设置为更简单接口

答案 4 :(得分:0)

接口用于List和Queue的原因是 NOT 以减少过多的代码。

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

(这是完全描述这个概念的awesome answer

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

这使我们能够做出非常有力的事情:

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

这是一个巨大的优势。

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

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

Collection是一个界面。它定义了一个操作列表,但没有实现它们。

无法实例化集合。 可以实例化一个实现Collection的类。

有许多类实现Collection:ArrayList,Vector,TreeSet,LinkedList等......它们都具有不同的时髦功能,但它们也是有一些共同点:因为每个类实现Collection ,它们都实现了每个方法found here

这使我们能够做一件非常有力的事情:

  • 我们可以编写一个操作 ANY 类的方法来实现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);
}