java一维数组创建时,jvm自动填充默认值:基本类型为0、0.0、'\u0000'、false,引用类型为null;该机制不依赖构造器,仅对类字段生效,局部变量必须显式new。

Java 一维数组创建时,只要完成 new 操作(即在堆上分配了内存),其所有元素就会被 JVM 自动填充默认值——这个过程不依赖构造器、不执行初始化块,也不需要你写任何赋值语句。
基本类型数组的默认值很确定
这些值由 JVM 在内存清零阶段统一写入,速度快且无额外开销:
- int、short、byte、long → 0
- float、double → 0.0f、0.0
- char → '\u0000'(不是空格,是 Unicode 的空字符,ASCII 码为 0)
- boolean → false
引用类型数组的默认值全是 null
这点特别关键,容易引发 NullPointerException:
-
String[] strs = new String[3];→strs[0]、strs[1]、strs[2]全是 null,不是空字符串,也不是新创建的String对象 -
ArrayList<string>[] listArr = new ArrayList[2];</string>→ 每个元素也是 null,必须先listArr[0] = new ArrayList();才能调用add() - 泛型数组不能直接写
new ArrayList<string>[3]</string>,编译报错;只能擦除泛型写成new ArrayList[3],运行时失去类型检查
只对类字段自动生效,局部变量必须显式 new
这个区别常被忽略:
- 类中声明的数组字段(如
private int[] data;),即使没new,也会被赋予默认值 null(注意:这是数组引用本身的默认值,不是元素) - 但方法内声明的局部数组,比如
int[] arr;,如果不执行arr = new int[5];,编译直接失败,提示 “variable arr might not have been initialized” - final 数组字段也一样:声明后必须在构造器或初始化块里完成
new,否则编译不过
初始化语法不同,行为也不同
别把写法混用,它们触发的机制不一样:
-
int[] a = new int[3];→ 动态初始化,长度确定,元素填默认值 0 -
int[] b = {1, 2, 3};→ 静态初始化,编译期定长并赋值,不能用于 static final 字段以外的非静态上下文 -
String[] s = new String[]{"a", "b"};→ 唯一能在参数、返回值、匿名类中使用的字面量形式,等价于静态初始化 -
String[] x = new String[0];→ 长度为 0 的空数组,合法且安全,和null完全不同
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











