假设我有 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
}
我想知道在这个自动生成的构造函数中将为数组数据类型分配什么值。如果它为所有占位符分配零,那么它不会影响大尺寸数组的程序性能,因为将零分配给就时间而言,数组的所有成员并不是一个便宜的任务。
注意:(更新)
它不存储 null。 What is the default initialization of an array in Java? 它存储零。所以我的问题是它会影响大型数组的性能吗?
最佳答案
从此测试类:
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 源代码,看看是否可以找出数组是如何创建的,但我怀疑大型数组创建开销应该是您最不用担心的......
关于Java数组通过类构造函数初始化(性能问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24093655/