2012-09-02 72 views
8

爲什麼Queue是一個接口,但其他類似StackArrayList是類?java.util包 - 類vs接口

我明白接口是由這樣客戶可以實現它們,並添加自己的方法,而用類,如果每個客戶端都需要在那裏就會變成巨大而臃腫的方法..

...或我在這裏錯過了什麼嗎?

+2

你已經正確地發現了一個輕微的不一致。整體而言,Java是相當不錯的,但是在這個世界上,沒有什麼是完全正確的。 :-) Veer的回答下面提到Stack是來自舊版本,但有時一切都必須堅持。 –

+0

有趣的是,如果你點擊「Queue」API文檔的「使用」,你會看到實現,但沒有實際使用它。在正常使用情況下,它在班級中被私人使用。如果界面不存在,則不會有重大影響。 –

回答

7

A Queue可以以多種方式實施,如ListSet。他們都只是爲不同類型的收藏指定合同。

然而,ArrayListList的特定實施方式,其被製成內部使用數組來存儲元件。 LinkedList也是List的實現,其使用一系列互連的節點,即doubly linked list。類似地,TreeSetHashMap分別是組和映射的特定實現。

現在,Stack在這裏是一個奇怪的情況,特別是因爲它是舊版Java的遺留類。你真的不應該再使用Stack了;相反,你應該使用它的現代等價物,ArrayDequeArrayDequeDeque(雙端隊列)的實現,它在內部使用數組進行存儲(這正是Stack所做的)。一個Deque支持全部Stack的操作,像poppushDeque其他實現包括LinkedList,正如別人所說,雖然這從Stack偏離在底層它不是一個數組,而是一個雙向鏈接list :-p

現在,有很多Queue的實現,以及許多不同類型的Queue s。您不僅有BlockingQueue(通常用於生產者 - 消費者),其常見實施包括LinkedBlockingQueueArrayBlockingQueue,還有TransferQueue等等。我離題...你可以閱讀更多有關Java Tutorial的收集API。

+0

感謝您的回答。對於遲到的感謝信請道歉。我記得閱讀這篇文章,它有道理,但完全忘了回覆。 – Siddhartha

3

您可以正確理解接口。在這種情況下,Java標準庫已經提供了實現和接口。 您最好使用一個接口,以便隨時切換實施。

希望它是有道理的。

0

我認爲Stack是一個應該成爲界面的類。在正確選擇提供接口時,Java庫有點碰巧。

ArrayList只是List接口的一個實現,所以Sun在那裏正確無誤!另一個經典的錯誤(在我看來)是Observable類,它非常需要是接口的默認實現,而不僅僅是一個類。

+0

'Observable'是非常多的1.0類。一個稍微更現代的等價物是'java.beans.PropertyChangeSupport',你可以通過組合來實現。 –

0

有趣的問題。我認爲Queue是BlockingQueue,PriorityQueue,Deque等許多數據結構的基礎。這些類需要針對各種操作的具體實現,因此將Queue作爲接口要簡單得多。

0

接口用於列表和隊列的原因是不是以減少過多的代碼。

接口的主要優點是它們允許您編寫靈活,鬆散耦合的代碼。

(這裏是一個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); 
}