[英]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
應該以不同的名稱命名,例如newSet
, copyOfS1
或其他類似的東西。
沒有區別。 兩者都將創建一個包含集合s1中所有元素的新集合。
當然,你的第二個代碼示例甚至不會編譯,因為你不能直接實例化Set
接口,但我假設你想說new HashSet
而不是new Set
。
有一點不同,因為新的HashSet(s1)將事先確保所有元素都適合,並且不需要重新散列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.