Jan*_*sha 13 java arrays initialization
我想知道在初始化对象如ArrayList <>和字段声明或构造函数中的东西是否有区别.
内存使用,性能或类似内容是否存在差异,还是完全相同?
选项1:
class MyClass {
private List<String> strings = new ArrayList<String>();
}
Run Code Online (Sandbox Code Playgroud)
选项2:
class MyClass {
private List<String> strings;
public MyClass() {
strings = new ArrayList<String>();
}
}
Run Code Online (Sandbox Code Playgroud)
这可能是一个愚蠢的问题,或者是一个非常基本的问题,但我喜欢从一开始就建立,我喜欢理解我所看到的一切.
是有区别的:当初始化发生.首先初始化字段,然后构造函数触发.
在你琐碎的例子中,没有实际的区别,但是如果另一个字段依赖于List字段进行初始化,那么构造函数版本会随着NPE而爆炸.
考虑:
private List<String> strings = Arrays.asList("foo", "bar");
private String stringsDescription = strings.toString();
Run Code Online (Sandbox Code Playgroud)
如果您将初始化移动strings到构造函数,初始化stringsDescription将与NPE一起爆炸.
看看这个默认构造函数与内联字段初始化
还有其他方法来初始化值:https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
恕我直言,在默认构造函数中初始化的风险有点大,除非您确定这是您拥有的唯一构造函数。如果您有多个,则需要始终调用默认值(良好实践)或复制初始化代码。
本质上是一样的。在构造函数中执行此操作可以对其进行更多控制(例如,不同的构造函数可以执行不同的操作),但最终结果是相同的。
无论哪种方式,您都不会发现内存、CPU 或其他任何东西的性能差异。
| 归档时间: |
|
| 查看次数: |
11387 次 |
| 最近记录: |