2011-09-03 127 views
2
List<String> someName = new ArrayList<String>(); 

ArrayList<String> someName = new ArrayList<String>(); 
  1. 這對性能有影響嗎?
  2. 第一個是對象列表,後一個是對象的ArrayList。糾正我,如果我錯了。我很困惑,因爲ArrayList實現了List接口。
  3. 爲什麼人們會這樣聲明?它有助於任何製造。
  4. 當我收到來自DB的一些電子郵件地址時,收集它的最佳方法是什麼?電子郵件地址對象列表?
  5. 最後一個不相關的問題....可以一個接口有兩個方法名稱具有相同的名稱和簽名和具有不同簽名的相同名稱。
+1

好的一組問題,但如果您在代碼示例中使用了兩個不同的變量名,則會稍微容易回答。 – Uffe

回答

6

聲明之間的區別更多的是樣式。最好使用抽象來聲明變量,而不是具體的實現,因爲您可以在不更改變量類型的情況下更改實現選項。例如,你可以改變List來代替使用LinkedList。

如果您始終使用抽象類型(接口或抽象類),特別是在方法簽名中,客戶端代碼可以自由使用任何他們喜歡的實現。這使得代碼更加靈活和易於維護。

即使是變量聲明也是如此。試想一下:

public abstract class MyListUsingClass { 

    private List<String> list; 

    protected MyListUsingClass(List<String> list) { 
     this.list = list; 
    } 

    ... 
} 

如果變量list被宣佈爲ArrayList,然後只有的ArrayList將在構造函數中接受。這將是一個糟糕的選擇:始終嘗試讓客戶端代碼選擇他們想要使用的實現。

關於你最後一個問題:接口對於方法有類似的限制,所以你可以overload methods

1
  1. 表現 - 可能不是。
  2. 實際上它們是字符串列表,而不是對象。接口不是Collection
  3. 中保存的內容的點如果您希望使代碼獨立於具體的列表實現,則定義超類類型的變量可能非常有用。如果有一天你想更改列表LinkedList實施 - 這將不會對所有代碼有害
  4. 創建新類型的電子郵件並將它們存儲到某種列表(例如提到的LinkedListArrayList)或只是數組(電子郵件[])。如果您提供更多信息 - 這可能會有所幫助。

編輯 2.在這兩種情況下,他們是字符串的ArrayList。不同之處在於,在第一種情況下,您正在投射到超類(無法訪問特定於ArrayList的某些方法)

+0

字符串*是*對象。 –

+2

@Martijn:但'列表'不是'List '。 –

+0

@Cameron:的確如此。 –

1

在第一個原因中,您聲明瞭var類型列表並使用ArrayList作爲其實現。

在第二種情況下,您聲明並定義了一個數組列表。

所不同的是,使用interface類型(在第一種情況下),你將只能訪問在List接口中定義的方法,如果ArrayList有一些具體實施辦法,才能訪問他們,你將需要將您的列表轉換爲其子類型(ArrayList)。

在第二種情況下,您使用的是更具體的類型,因此根本不需要轉換。

2
  1. 沒有性能影響,因爲在運行時您在兩種情況下都處理相同的類(ArrayList)。
  2. 它們都是字符串列表。不同的是,第一個是作爲List被聲明爲,而被初始化爲作爲ArrayList,它是更具體類型的List。
  3. 一個有幫助的實例是當您使用帶有上下文敏感建議的IDE(Eclipse,NetBeans等)時。在第一種情況下,只要您使用建議功能,您將只能看到List界面的成員。第二,你會看到ArrayList的所有(公共)成員。在任何給定的編程情況下,只要更抽象的類型提供了你需要的功能,你就想使用它,因爲它使你的代碼更健壯:類型越抽象,在未來版本中改變的可能性就越小的API。
  4. 表示任何事情的最佳方式總是取決於您打算使用的數據以及它的數量。可能是一個List或一組javax.mail.internet.InternetAddress將適合該法案。
  5. 只有當接口具有不同的參數類型簽名時,接口才可以具有兩個具有相同名稱的方法。即使參數名稱不同,兩個採用單個字符串的方法也不能具有相同的名稱,也不能有兩個名稱相同的方法僅在返回類型中有所不同。
1
  1. 這對性能有影響嗎?沒有可衡量的影響。你的代碼將成爲你的性能問題的根源,而不是像這樣的納米優化。
  2. 第一個是對象列表,後一個是對象的ArrayList。糾正我,如果我錯了。我很困惑,因爲ArrayList實現了List接口。究竟。您可以將類引用分配給它實現的任何類型。
  3. 爲什麼人們會這樣聲明?它在任何情況下都有幫助。你可能想要的原因是,如果你想改變你的實現來使用另一個實現List的具體類,例如LinkedList的。
  4. 當我收到來自DB的一些電子郵件地址時,收集它的最佳方法是什麼?電子郵件地址對象列表?定義「最佳」。取決於你將如何使用它們。字符串可能就足夠了;也許更好的抽象會爲你工作。
  5. 最後一個不相關的問題....可以一個接口有兩個方法名稱具有相同的名稱和簽名以及具有不同簽名的相同名稱。接口定義簽名,而不是實現。您可以使用兩個接口來定義相同的簽名,但執行時只能有一個實現。如果你有一個牛仔和藝術家的界面,兩個都使用void draw()方法,那麼實現這兩個方法的類將不得不決定單個實現是什麼。 Cowboy和Artist不可能有一個,因爲接口沒有任何實現的概念。