[英]What is the difference between ArrayList<?>, ArrayList, ArrayList<Object>?
[英]What is the difference in time & space complexity between declaring an ArrayList object and a List object?
我知道可以通過以下兩種方式聲明ArrayList的實例:
ArrayList<String> list = new ArrayList<String>();
和
List<String> list = new ArrayList<String();
我知道使用后一種聲明可以靈活地將實現從一個List子類更改為另一個List子類(例如,從ArrayList到LinkedList)。
但是,兩者的時間和空間復雜度有何不同? 有人告訴我,前一個聲明最終將使堆內存用完。 為什么會這樣?
編輯:在執行基本操作(如添加,刪除和包含)時,兩種實現方式的性能是否有所不同?
數據結構的空間復雜度以及對其進行不同操作的時間復雜度都是特定於實現的。 對於上面列出的兩個選項,您正在使用相同的數據結構實現,即ArrayList<String>
。 將它們聲明為等號左側的類型不會影響復雜性。 如您所說,在等號左側鍵入更通用的類型僅允許交換實現。
決定對象行為的是對象的實際類/實現。 在您的示例中, list
仍然是ArrayList
,因此行為不會改變。
使用List<>
聲明而不是ArrayList<>
意味着您將只使用通過List
接口可見的方法,並且如果以后需要另一種類型的列表,則更改它很容易(您只需更改調用到new
)。 這就是為什么我們經常喜歡它。
示例 :首先使用ArrayList
但隨后發現您經常需要刪除列表中間的元素。 因此,您將考慮切換到LinkedList
。 如果在各處(使用getter / setter等)都使用List
接口,則代碼中的唯一更改將是:
List<String> list = new LinkedList<>();
但是如果您使用ArrayList
,那么您將需要重構您的getter / setter簽名,潛在的公共方法等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.