Java 在构造函数或字段声明中初始化列表

Java 在构造函数或字段声明中初始化列表,java,arrays,initialization,Java,Arrays,Initialization,我想知道在字段声明或构造函数中初始化ArrayList和stuff之类的对象是否有区别 在内存使用、性能或类似的方面是否存在差异,或者是否完全相同 备选案文1: class MyClass { private List<String> strings = new ArrayList<String>(); } class-MyClass{ 私有列表字符串=新的ArrayList(); } 备选案文2: class MyClass { private L

我想知道在字段声明或构造函数中初始化ArrayList和stuff之类的对象是否有区别

在内存使用、性能或类似的方面是否存在差异,或者是否完全相同

备选案文1:

class MyClass {
     private List<String> strings = new ArrayList<String>();
}
class-MyClass{
私有列表字符串=新的ArrayList();
}
备选案文2:

class MyClass {
    private List<String> strings;
    public MyClass() {
        strings = new ArrayList<String>();
    }
}
class-MyClass{
私有列表字符串;
公共MyClass(){
strings=newarraylist();
}
}

这可能是一个愚蠢的问题,或者是一个非常基本的问题,但我喜欢从一开始就构建,我喜欢理解我所看到的一切

本质上是一样的。在构造函数中执行此操作可以更好地控制它(例如,不同的构造函数可以执行不同的操作),但最终结果是相同的

无论采用哪种方式,您都不会看到内存、CPU或其他任何方面的性能差异。

看看这个

还有其他初始化值的方法:

依我看,在默认构造函数中初始化会有一点风险,除非您确定它是您拥有的唯一构造函数。如果有多个,则需要调用always default(良好做法)或复制初始化代码。

有一个区别:初始化发生时。首先初始化字段,然后启动构造函数

在您的简单示例中,没有实际的区别,但是如果另一个字段依赖于列表字段进行初始化,则构造函数版本将使用NPE爆炸

考虑:

 private List<String> strings = Arrays.asList("foo", "bar");
 private String stringsDescription = strings.toString();
private List strings=Arrays.asList(“foo”、“bar”);
私有字符串stringsDescription=strings.toString();

如果将
strings
的初始化移动到构造函数,则
stringsDescription
的初始化将随着NPE爆炸。

当您将arrayList声明为静态变量,以便可以从其他类访问它,而无需实例化持有它的类时,会出现另一个差异。在该设置中,您需要在声明时初始化,而不是在构造函数中初始化。考虑下面的例子,它给出了一个Null PoExtExchange:

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);
    }
}
import java.util.ArrayList;
公家犬{
公共静态数组列表;
公犬(){
dogList=newarraylist();
}
}
班犬{
弦品种;
公犬(弦犬){
这个品种;
}
公共静态void main(字符串[]args){
Dog dog1=新狗(“哈巴狗”);
Dogs.dogList.add(dog1);
}
}