爲什麼Queue是一個接口,但其他類似Stack和ArrayList是類?java.util包 - 類vs接口
我明白接口是由這樣客戶可以實現它們,並添加自己的方法,而用類,如果每個客戶端都需要在那裏就會變成巨大而臃腫的方法..
...或我在這裏錯過了什麼嗎?
爲什麼Queue是一個接口,但其他類似Stack和ArrayList是類?java.util包 - 類vs接口
我明白接口是由這樣客戶可以實現它們,並添加自己的方法,而用類,如果每個客戶端都需要在那裏就會變成巨大而臃腫的方法..
...或我在這裏錯過了什麼嗎?
A 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
偏離在底層它不是一個數組,而是一個雙向鏈接list :-p
現在,有很多Queue
的實現,以及許多不同類型的Queue
s。您不僅有BlockingQueue
(通常用於生產者 - 消費者),其常見實施包括LinkedBlockingQueue
和ArrayBlockingQueue
,還有TransferQueue
等等。我離題...你可以閱讀更多有關Java Tutorial的收集API。
感謝您的回答。對於遲到的感謝信請道歉。我記得閱讀這篇文章,它有道理,但完全忘了回覆。 – Siddhartha
您可以正確理解接口。在這種情況下,Java標準庫已經提供了實現和接口。 您最好使用一個接口,以便隨時切換實施。
希望它是有道理的。
我認爲Stack
是一個應該成爲界面的類。在正確選擇提供接口時,Java庫有點碰巧。
ArrayList
只是List
接口的一個實現,所以Sun在那裏正確無誤!另一個經典的錯誤(在我看來)是Observable
類,它非常需要是接口的默認實現,而不僅僅是一個類。
'Observable'是非常多的1.0類。一個稍微更現代的等價物是'java.beans.PropertyChangeSupport',你可以通過組合來實現。 –
有趣的問題。我認爲Queue
是BlockingQueue,PriorityQueue,Deque等許多數據結構的基礎。這些類需要針對各種操作的具體實現,因此將Queue
作爲接口要簡單得多。
接口用於列表和隊列的原因是不是以減少過多的代碼。
接口的主要優點是它們允許您編寫靈活,鬆散耦合的代碼。
(這裏是一個awesome answer描述這個概念完美)
接口只是定義的,將被類實現方法的列表。
這讓我們做一個奇妙的強大的東西:
這是一個巨大的優勢。
這裏是一個非常簡單的例子:
我們要編寫打印在Collection每個元素調試方法。
Collection是一個接口。它定義了一個操作列表,並沒有實現它們。
你不能實例化一個集合。您可以可以實例化一個實現Collection的類。
有實現Collection許多類:ArrayList中,矢量,TreeSet中,鏈表等......他們都有着不同的時髦功能,但他們也有某些共同之處:因爲每個類實現集合,它們全部實施各種方法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);
}
你已經正確地發現了一個輕微的不一致。整體而言,Java是相當不錯的,但是在這個世界上,沒有什麼是完全正確的。 :-) Veer的回答下面提到Stack是來自舊版本,但有時一切都必須堅持。 –
有趣的是,如果你點擊「Queue」API文檔的「使用」,你會看到實現,但沒有實際使用它。在正常使用情況下,它在班級中被私人使用。如果界面不存在,則不會有重大影響。 –