2012-02-24 63 views
1

爲了一個列表轉換爲一個數組,你需要一個空數組像以下:創建一個空數組的開銷?

List<Foo> fooList; 
Foo[] foos = fooList.toArray(new Foo[0]); 

我碰巧使用該代碼段有很多,所以不是創建一個空數組每一次,我決定創建一個靜態的空數組,並且每次都使用它。例如

private static Foo[] EMPTY_FOOS = new Foo[0]; 

List<Foo> fooList; 
Foo[] foos = fooList.toArray(EMPTY_FOOS); 

這是值得的嗎?或者我們正在看差異0.000000000000000000000000000000000000000000000000000001ms?

+0

它可以是值得的。這是分析的目的。只有你可以確定你自己的代碼中有什麼瓶頸。 – 2012-02-24 23:01:01

+0

位優化是問題的根源。 – 2012-02-24 23:03:44

+2

@Saeed,廢話。在觀察實際問題之前,問題就是優化。 – 2012-02-24 23:05:20

回答

7

其實我相信這是表現最好的版本:

fooList.toArray(new Foo[fooList.size()]); 

這樣toArray()始終具有確切的陣列並沒有多餘的陣列創建。 IntelliJ提出了這種重構框。

+1

優秀點+1。如果你不這樣做,反正它會分配更多的數組。 – 2012-02-24 23:06:16

+1

或者直接不使用Java的「數組」對象? (ArrayList等,在內部使用它們。)它們實際上是在Java Collection框架中被拋棄的。 – 2012-02-24 23:16:29

+0

如果傳遞的數組的大小小於集合的大小(包括0),那麼它將創建恰好一個正確數量的元素的多個數組(而不是「數組」)。但是,它確實使用了反射來實現這一點,所以你的方式仍然是可取的。 – 2012-02-24 23:22:39

2

在我的電腦上創建100,000,000個Object[0]陣列需要2.9秒。如果你每秒鐘創建100萬個陣列,甚至10萬個陣列,它可能會產生可測量的差異。

1

我認爲這將是更有意義的問題,爲什麼你需要將數組轉換爲列表,反之亦然。如果可以的話,你最好堅持使用Collection類,避免使用數組,因爲它們更容易使用Collection類。

如果您使用了很多代碼片段,然後編寫一個可以重複使用的方法,但爲了確定您應該投入多少努力來優化此代碼,您需要對其進行配置並查看開銷是多少與您的其他代碼相關,以及此代碼在運行時實際使用的頻率。如Knuth所說:「過早優化是萬惡之源」:-)