我想知道初始化像ArrayList<>这样的对象是否有区别以及字段声明或构造函数中的内容。
内存使用率、性能或类似方面是否存在差异,或者完全相同?
选项1:
class MyClass {
private List<String> strings = new ArrayList<String>();
}
选项2:
class MyClass {
private List<String> strings;
public MyClass() {
strings = new ArrayList<String>();
}
}
这可能是一个愚蠢的问题,或者是一个非常基本的问题,但我喜欢从一开始就构建,我喜欢理解我所看到的一切。
有一个区别:当初始化发生时。首先初始化字段,然后激发构造函数。
在您的琐碎示例中,没有实际的区别,但如果另一个字段依赖于List字段进行初始化,则构造函数版本将以NPE爆炸。
考虑:
private List<String> strings = Arrays.asList("foo", "bar");
private String stringsDescription = strings.toString();
如果将strings
的初始化移动到构造函数,则stringsDescription
的初始化将以NPE爆炸。
看看这个默认构造函数与内联字段初始化
还有其他初始化值的方法:https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
IMHO,在默认构造函数中初始化会有一点风险,除非你确定这是你唯一的构造函数。如果有多个,则需要调用"始终默认"(良好做法)或复制初始化代码。
本质上是一样的。在构造函数中执行它可以对它进行更多的控制(例如,不同的构造函数可以做不同的事情),但最终结果是相同的。
您将不会看到内存、CPU或任何其他方面的性能差异。
当您将arrayList声明为静态变量时,会出现另一个差异,这样就可以从其他类访问它,而无需实例化持有它的类。在该设置中,您需要在声明时初始化,而不是在构造函数中初始化。考虑以下给出NullPointerException的示例:
import java.util.ArrayList;
public class Dogs {
public static ArrayList<Dog> dogList;
public Dogs(){
dogList = new ArrayList<>();
}
}
class Dog {
String breed;
public Dog(String breed){
this.breed = breed;
}
public static void main(String[] args) {
Dog dog1 = new Dog("pug");
Dogs.dogList.add(dog1);
}
}