2015-11-19 150 views
6

我想知道在初始化對象如ArrayList <>和字段聲明或構造函數中是否有區別。在構造函數或字段聲明中初始化列表

內存使用情況,性能或類似情況有差別還是完全相同?

選項1:

class MyClass { 
    private List<String> strings = new ArrayList<String>(); 
} 

選項2:

class MyClass { 
    private List<String> strings; 
    public MyClass() { 
     strings = new ArrayList<String>(); 
    } 
} 

這可能是一個愚蠢的問題,還是一個很基本的一個,但我喜歡從一開始建立,我想了解所有我看到的。

回答

1

它本質上是一回事。在構造函數中執行它可以更好地控制它(例如,不同的構造函數可以做不同的事情),但最終的結果是相同的。

在內存,CPU或任何其他方式中,您將看不到任何性能差異。

2

有差別:發生初始化。字段首先被初始化,然後構造函數觸發。

在你的微不足道的例子中,沒有實際的區別,但是如果另一個字段依賴於List字段進行初始化,那麼構造函數版本將會以NPE爆炸。

考慮:

private List<String> strings = Arrays.asList("foo", "bar"); 
private String stringsDescription = strings.toString(); 

如果你感動的strings初始化到構造的stringsDescription初始化將與NPE爆炸。

相關問題