假设我有A和B类,代码是这样的:
class A
{
private int x;
private int[] y=new int[10];
private string s;
}
public class B
{
public static void main(String args[])
{
A a=new A();
}
我的理解是当类A没有定义构造函数时,JVM会自动定义一个这样的构造函数:
//Auto generated constructor
A()
{
x=0;
s=NULL;
y[]=//What will come here
}
我想知道在这个自动生成的构造函数中将为数组数据类型分配什么值。如果它为所有占位符分配零,则不会影响大型数组的程序性能,因为将零分配给数组的所有成员在时间上都不是一个便宜的任务。
注:(UPDATE)
它不存储null。What is the default initialization of an array in Java? 它存储零。所以我的问题是它会影响大型数组的性能。
答案 0 :(得分:3)
从这个测试类:
public class Test {
int[] x;
public static void main(final String[] args) {
System.out.println(new Test().x);
}
}
你得到这个输出:
null
如果在编译为字节码之前使用javac -XD-printflat
来查看编译器对源的作用,那么你会得到:
public class Test {
public Test() {
super();
}
int[] x;
public static void main(final String[] args) {
System.out.println(new Test().x);
}
}
由于x
从未直接初始化,它将是null
(目前无法找到相关的JLS段落,但也许我会在某个时候偶然发现它。 )
如果您将x
初始化为new int[10]
,则会在编译到字节码之前立即使用此已处理的源:
public class Test {
public Test() {
super();
}
int[] x = new int[10];
public static void main(final String[] args) {
System.out.println(new Test().x);
}
}
因此,在任何情况下,该字段都被初始化为与构造函数体的其余部分分开的步骤。 JLS 12.5明确地说明了这一点 - 实例初始化器和实例变量初始化器在与构造函数的其余部分分开的步骤中执行。
但是,如果您使用new int[size]
显式初始化数组,那么您最终会得到一个全0的数组,正如您所指出的那样。这是否是一个性能问题实际上是一个没有实际意义的问题,因为JLS明确指定了数组的默认值是什么,并且您将无法逃脱性能命中(如果有的话)。我现在正在查看JDK源代码,看看我是否可以了解如何创建数组,但我怀疑大数组创建开销应该是您最不关心的......
答案 1 :(得分:1)
它将为null。数组被视为对象。
如果初始化一个数组(int[] a = new int[10]
),它将使用它们的默认值填充元素(例如对于int为零或对象和数组为null)。
但是,默认构造函数不会这样做。它只是将整个数组设置为null。
答案 2 :(得分:1)
我通过调试检查了这一点。
它将是[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
因为您设置(初始化数组)private int[] y = new int[10];
。
如果您没有像private int[] y
那样初始化此数组,那么它将是null
。
对于您的效果问题,请查看此answers。
答案 3 :(得分:0)
如果没有像这样private int[] y
初始化数组,它返回null但是通过使用new这样的private int[] y=new int[10];
它使用类型数组的默认值填充数组(在这种情况下它是int)
答案 4 :(得分:0)
在java中,所有基元类型都将初始化为其默认值。因此,如果您定义int类型的数组及其大小,那么所有值都将初始化为0.原始类型的开销比类少。