2013-06-12 129 views
2

所以很多時候我看到的ArrayList是實例化的方式「做List <Object> listObject = new ArrayList <Object>()?

List<Object> listObject = new ArrayList<Object>(); 

所以,我想知道這是什麼的ArrayList實例化這樣的意義是什麼?會發生什麼,如果我們實例的ArrayList()像

ArrayList<Object> listObject = new ArrayList<Object>(); 
+0

你可以看看這個話題。 http://stackoverflow.com/questions/2279030/type-list-vs-type-arraylist-in-java – dijkstra

+0

[可能與「編程接口」有什麼區別?](http:// stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface) –

回答

2

這是因爲一個事實,即它總是一個很好的做法,編寫代碼接口而不是實現。所以當你做List<Object> listObject = new ArrayList<Object>();時,你總是可以自由地將ArrayList改爲LinkedList,而代碼中的其他地方不需要改變。因此,編程接口(List)在這裏爲您提供了改變底層實現而不影響代碼中其他位置的自由/權力。我會建議你閱讀this small note以更清晰。

0

有一個在您的兩個例子列表實現之間沒有什麼區別。但是有一個方法,你可以在你的代碼進一步使用變量myList中的差異。

當你將您的列表定義爲:

List myList = new ArrayList(); 

您只能調用屬於List類的方法和引用成員。如果你將它定義爲:

ArrayList myList = new ArrayList(); 

你就可以調用除了那些從名單繼承ArrayList的具體方法和使用ArrayList特定成員。但是,當您在第一個示例中調用List類的方法時,它在ArrayList中被重寫,那麼ArrayList中的方法將被調用而不是List中的方法。

這就是所謂的多態性。

+0

你沒有真正解釋*爲什麼這是經常完成的。 –

7

List是一個接口,ArrayList類是該接口的具體實現。

List<Object> listObject = new ArrayList<Object>(); 

使用此功能,您可以在將來更改List實施。 List listObject可以調用List接口中聲明的所有方法。在未來,如果你不希望ArrayList實施List的,並改變它說LinkedList,你可以這樣做:

List<Object> listObject = new LinkedList<Object>(); 

你不會有改變,它使用listObject的代碼,如果你已經宣佈listObjectList接口類型,而不用擔心它打破了代碼的其餘部分,因爲你可能已經使用一些具體的事情來ArrayList同意本聲明:

ArrayList<Object> listObject = new ArrayList<Object>(); 

這就是所謂編程到接口,而不是實現。

0

這會「計劃到接口,而不是一個執行」

請看看thisthis

0

List是一個接口,而ArrayList是一個類。最佳實踐說:針對接口的程序,而不是具體的類

實際上,這兩個定義之間可能沒有區別(將變量類型定義爲接口vs類),但使用List會使您的代碼依賴於接口,而不是類。然後,您可以稍後更改變量的實際類型,而不影響正在使用該變量的代碼。

0

由於的Java 7的這些都是List

所有已知實現類已知的實現:
AbstractList中,AbstractSequentialList, ArrayList中,AttributeList中,的CopyOnWriteArrayList,鏈表,RoleList的, RoleUnresolvedList,Stack,Vector

撇開抽象類,這意味着未來如果你想插入除ArrayList之外的其他List實現,你有多種選擇。

也被稱爲Coding to Interfaces這是一個廣泛使用的編程範例。

+0

從上面的討論中,我明白了「編碼到接口」使我們可以自由地使用實現該接口的類的各種實現。因此它減少了照顧實施課程及其方法的開銷。我們可以在它們之間交換運行時間。像這裏一樣,我們也可以在需要的地方使用LinkedList,而不是Arraylist。 –

+0

@PankajDeshpande現貨! –

0

當您使用List時,您使用抽象。成像的情況,其中有函數調用預計List<Object>

List<Object> myList = myFunction(); 
現在

函數myFunction的(), 它能夠更好地使用

List<Object> myList = new ArrayList<Object>(); 
return myList; 

ArrayList<Object> myList = new ArrayList<Object>(); 

,因爲你會避免不必要的鑄造。調用函數只需要一個List而不考慮它的實現。

此外,List接口提供了很多適用於所有實現的通用功能。因此,您可以編寫一些通用代碼操縱列表,而不管其是否爲LinkedListArrayList。這是使用Abstraction的優勢。

0

列表是一個接口。當你將接口定義爲參考時,我們必須使用它的實現來實例化。

0

大部分答案都是關於「編碼到接口」的口頭禪。雖然這是一個很好的建議,但可能會導致一些問題。具體而言,在List的情況下,對象listObject的用戶將不知道底層數據結構的效率。例如,如果這是ArrayList的一個實例,則獲取最後一個元素僅爲O(1),而如果它是LinkedList那麼它是O(listObject.size)

因此,知道確切的底層數據結構非常重要,這可以通過使用變量聲明的實現類型來實現。例如,Scala的List是一個使數據結構清晰的類。因此,我會說,一如既往,決定應該是一個明智的決定,並迎合您的應用程序的設計。如果數據結構應該是「列表」,並且沒有具體實現的要求已知,則使用List進行聲明。然而,如果一組應該在該數據結構上工作的算法是衆所周知的,那麼使用具體的實現類(即ArraysList,LinkedList),以確保這些算法的最佳性能。

相關問題