2012-03-01 25 views
13

我想知道哪個更有效率,爲什麼?番石榴immutableList copyOf vs生成器

1)

List<Blah> foo; 
... 
return ImmutableList.copyOf(foo); 

2)

List<Blah> foo; 
... 
return new ImmutableList.Builder<Blah>().addAll(foo).build(); 
+8

你認爲這是你的性能瓶頸嗎?因爲除非你有一個特定的**理由,你爲什麼關心這個效率,你現在應該忽略這個方面,並使用更可讀的(即第一個)。 – 2012-03-01 13:42:21

+1

在我開始在我的項目中使用番石榴之前,我只是好奇而已。我不確定哪個是'正確'的方法 – user973479 2012-03-01 13:52:04

+6

如果有一個簡單的單方法調用方式,它完全符合您的要求並且可以使用對象構建和雙方法調用方式)同樣的事情,那麼我會每次選擇更簡單的。 – 2012-03-01 13:56:09

回答

28

我看不出有任何理由你應該使用建設者在這裏:

  • ImmutableList.copyOf是多少比製作​​更可讀在這種情況下,
  • Builder時與其他不可變集合調用不能由此推斷泛型類型,你必須通過 自己作爲一個班輪使用時指定類型,
  • (從文檔)ImmutableList.copyOfdoes good magic試圖避免實際複製數據時,它是安全的這樣做
  • (源文件)Builder#addAll調用先前創建ArrayListcopyOf避免創建任何列表addAll對於零和一元集合(返回空不可變列表和單不可變列表分別),
  • (從源)copyOf(Collection)實例不創建臨時ArrayListcopyOf(Iterable)copyOf(Iterator)這樣做),
  • (來源)此外,Builder#build調用copyOf在以前內部填充ArrayList,什麼給你帶來你的問題 - 爲什麼在這裏使用Builder,當你有copyOf

P.S.我個人使用ImmutableList.builder()靜態工廠,而不是new ImmutableList.Builder<Blah>()構造函數 - 當分配給Builder<Blah>變量時,第一個推斷泛型,而後者不推薦。

+0

感謝您的詳細解釋! – user973479 2012-03-01 14:47:56