为什么Queue是一个界面,但Stack和ArrayList之类的其他类是什么?
我理解接口是这样的,客户端可以实现它们并添加自己的方法,而对于类,如果每个客户端都需要它们的方法,它将变得庞大而臃肿......
......或者我在这里遗漏了什么?
答案 0 :(得分:7)
Queue
可以通过多种方式实施,List
或Set
也是如此。他们都只是为不同类型的集合指定合同。
然而,ArrayList
是List
的特定实现,用于在内部使用数组来存储元素。 LinkedList
也是List
的实现,它使用一系列互连节点,即doubly linked list。同样,TreeSet
和HashMap
分别是集合和地图的特定实现。
现在,Stack
在这里是一个奇怪的例子,特别是因为它是旧版Java的遗留类。你真的不应该再使用Stack
;相反,你应该使用它的现代等价物ArrayDeque
。 ArrayDeque
是Deque
(一个双端队列)的实现,它在内部使用数组进行存储(这正是Stack
所做的)。 Deque
支持Stack
的所有操作,例如pop
,push
等。Deque
的其他实现包括LinkedList
,如其他人提到的,虽然这与Stack
不同,因为它不是一个数组,而是一个双向链表:-p
现在,有很多Queue
的实现,以及许多不同类型的Queue
。您不仅拥有BlockingQueue
s(通常用于生产者 - 消费者),其常见实现包括LinkedBlockingQueue
和ArrayBlockingQueue
,还有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。
这使我们能够做一件非常有力的事情:
看起来就像这样:
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);
}