簡體   English   中英

這兩組陳述之間的確切區別是什么?

[英]What is the exact difference between these two groups of statements?

Set<Type> union = new HashSet<Type>(s1);

Set<Type> union = new HashSet<Type>();
Set<Type> s1 = new HashSet<Type>();
union.addAll(s1);

一個將更有效,因為第二個Set將在后備數據結構中使用正確的空間量創建,在第二段代碼中, Set必須調整大小以便為新元素騰出空間。

就最終結果而言,它們是相同的。

假設Set s1在第一個和第二個例子中包含相同的內容,最終結果應該是相同的。

(但是,第二個示例不會編譯,因為Set是一個接口而不是具體的類。)

使用HashSet(Collection)構造函數的一個優點是它的初始容量足以容納傳遞給構造函數的Collection (在本例中為Set s1 ):

構造一個包含指定集合中元素的新集合。 使用默認加載因子(0.75)創建HashMap ,初始容量足以包含指定集合中的元素。

但是,使用HashSet()構造函數時,初始大小為16,因此如果通過Collection.addAll添加的Set大於16,則必須調整數據結構的大小:

構造一個新的空集; 后備HashMap實例具有默認初始容量(16)和加載因子(0.75)。

因此,在性能和效率方面,使用HashSet(Collection)構造函數創建HashSet可能是更好的選擇。

但是,從代碼的可讀性的角度來看,變量名稱union似乎暗示新創建的Set是另一個Set的並Set ,因此使用addAll方法的addAll可能是更容易理解的代碼。

如果想法只是從現有的Set創建一個新的Set ,那么新創建的Set應該以不同的名稱命名,例如newSetcopyOfS1或其他類似的東西。

沒有區別。 兩者都將創建一個包含集合s1中所有元素的新集合。

當然,你的第二個代碼示例甚至不會編譯,因為你不能直接實例化Set接口,但我假設你想說new HashSet而不是new Set

有一點不同,因為新的HashSet(s1)將事先確保所有元素都適合,並且不需要重新散列。

暫無
暫無

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

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