为什么Queue是接口,而Stack和ArrayList等其他接口是类?
我知道接口的制作是为了让客户可以实现它们并添加他们自己的方法,而对于类,如果每个客户都需要他们的方法,那么它会变得巨大而臃肿..
...或者我在这里错过了什么?
AQueue
可以以多种方式实现,aList
或 a也可以Set
。他们都只是为不同类型的集合指定了一个合同。
然而, anArrayList
是 a 的特定实现,用于List
在内部使用数组来存储元素。LinkedList
也是 a 的一种实现List
,它使用一系列相互连接的节点,即双向链表。同样,TreeSet
和HashMap
分别是集合和映射的特定实现。
现在,Stack
这是一个奇怪的情况,特别是因为它是旧版本 Java 的遗留类。你真的不应该再使用 aStack
了;相反,您应该使用它的现代等价物ArrayDeque
. ArrayDeque
是一个Deque
(双端队列)的实现,它在内部使用一个数组进行存储(这正是Stack
它的作用)。ADeque
支持 a Stack
,like pop
,等的所有操作。 includepush
的其他实现,正如其他人所提到的,虽然这偏离了底层它不是一个数组,而是一个双向链表:-pDeque
LinkedList
Stack
现在,有很多 s 的实现Queue
,以及许多不同类型的Queue
s。你不仅有BlockingQueue
s(通常用于生产者-消费者),它的常见实现包括LinkedBlockingQueue
and ArrayBlockingQueue
,还有TransferQueue
s 等等。我离题了...您可以在相关的Java 教程中阅读有关集合 API 的更多信息。
你正确地理解了接口的概念。在这种情况下,Java 标准库已经提供了实现和接口。您最好使用接口,以便您可以随时切换实现。
希望这是有道理的。
我认为Stack
作为一个应该是接口的类而闻名。在正确选择提供接口时,Java 库有点失败。
ArrayList
只是List
接口的一个实现,所以 Sun 在那里得到了它的正确性!另一个经典的失误(在我看来)是Observable
类,它非常需要成为接口的默认实现,而不仅仅是一个类。
有趣的问题。我认为这Queue
是许多数据结构(如 BlockingQueue、PriorityQueue、Deque 等)的基础。这些类需要针对各种操作进行特定实现,因此将其制作Queue
为接口要简单得多。
接口用于 List 和 Queue 的原因不是为了减少过多的代码。
接口的主要优点是它们允许您编写灵活、松散耦合的代码。
(这是一个很棒的答案,完美地描述了这个概念)
接口只是定义了一个类将要实现的方法列表。
这使我们能够做一件非常强大的事情:
这是一个巨大的优势。
这是一个非常简单的例子:
我们想编写一个调试方法来打印Collection中的每个元素。
集合是一个接口。它定义了一个操作列表并且不实现它们。
您不能实例化集合。您可以实例化一个实现 Collection 的类。
实现Collection的类有很多:ArrayList、Vector、TreeSet、LinkedList 等......它们都有不同的时髦特性,但它们也有一些共同点:因为每个类都实现了 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);
}