簡體   English   中英

這兩個聲明有什么不同?

[英]What is the difference in these two declarations?

List<String> someName = new ArrayList<String>();

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

聲明之間的區別更多是樣式。 最好使用抽象而不是具體實現來聲明變量,因為您可以在以后更改實現選擇而不更改變量類型。 例如,您可以更改List以使用LinkedList。

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

即使是變量聲明也是如此。 考慮一下:

public abstract class MyListUsingClass {

    private List<String> list;

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

    ...
}

如果變量list聲明為ArrayList ,則構造函數中接受ArrayLists。 這將是一個糟糕的選擇:總是嘗試讓客戶端代碼選擇他們想要使用的實現。

關於你的最后一個問題:接口對類的方法有相同的限制,所以是的,你可以重載方法

  1. 沒有性能影響,因為在運行時,您在兩種情況下都處理相同的類(ArrayList)。
  2. 它們都是字符串列表。 區別在於第一個被聲明為List但初始化為ArrayList,這是一個更具體的List類型。
  3. 它有用的一個實例是當您使用具有上下文相關建議(Eclipse,NetBeans等)的IDE時。 在第一種情況下,無論何時使用建議功能,您都只能看到List接口的成員。 在第二個中,您將看到ArrayList的所有(公共)成員。 在任何給定的編程情況下,只要更抽象的類型提供您需要的功能,您就希望使用它,因為它使您的代碼更健壯:類型越抽象,在將來的某個版本中更改的可能性就越小的API。
  4. 表示任何內容的最佳方式總是取決於您打算使用數據的內容以及數據的大小。 可能是一個列表或一組javax.mail.internet.InternetAddress將適合該法案。
  5. 只有具有不同參數類型簽名的接口才能有兩個具有相同名稱的方法。 即使參數具有不同的名稱,兩個都采用單個字符串的方法也不能具有相同的名稱,也不能有兩個具有相同名稱且僅在返回類型上不同的方法。
  1. 表現 - 可能不是。
  2. 實際上它們是字符串列表,而不是對象。 接口不是Collection中的內容
  3. 如果您希望使代碼獨立於具體列表實現,則定義超類類型的變量可能很有用。 如果有一天你想將list更改為LinkedList實現 - 這對你的所有代碼都不會那么有害
  4. 創建新類型的EMail並將它們存儲到某種列表(例如,提到的LinkedListArrayList )或只是數組(EMail [])。 如果您提供更多信息 - 這可能會有所幫助。

編輯2.在這兩種情況下,它們都是字符串的ArrayList。 區別在於,在第一種情況下,您正在進行超類的轉換(無法訪問特定於ArrayList某些方法)

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

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

不同之處在於,使用interface類型(如第一種情況),您將只訪問List接口中定義的那些方法,如果ArrayList有一些特定的實現方法,為了訪問它們,您需要轉換列表到它的子類型(ArrayList)。

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

  1. 它會影響性能嗎? 沒有可衡量的影響。 您的代碼將成為您的性能問題的根源,而不是像這樣的納米優化。
  2. 第一個是sa對象列表,后者是對象的ArrayList。 如果我錯了,請糾正我。 我很困惑,因為ArrayList實現了List接口。 究竟。 您可以為其實現的任何類型分配類引用。
  3. 為什么人們這樣聲明? 它在任何情況下都有幫助。您可能希望的原因是,您希望更改實現以使用另一個實現List的具體類,例如LinkedList。
  4. 當我從DB收到一些電子郵件地址時,收集它的最佳方式是什么? 電子郵件地址對象列表? 定義“最佳”。 取決於你將如何使用它們。 字符串可能就足夠了; 或許更好的抽象對你有用。
  5. 最后一個不相關的問題....接口可以有兩個具有相同名稱和簽名的方法名稱以及具有不同簽名的相同名稱。 接口定義簽名,而不是實現。 您可以使用兩個接口來定義相同的簽名,但執行時只能有一個實現。 如果你有一個Cowboy和Artist接口,都有void draw()方法,那么實現兩者的類將必須決定單個實現是什么。 Cowboy和Artist不可能有一個,因為接口沒有任何實現的概念。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM