java中基本类型数组元素默认为零值(如int为0),引用类型数组元素默认为null;局部变量数组必须显式初始化,成员变量数组字段默认为null而非自动分配;arrays.fill()适用于基本类型和兼容的引用类型数组初始化。

Java中基本类型数组的默认值不是null而是零值
基本类型数组(如 int[]、boolean[]、double[])创建后,元素会自动初始化为对应类型的默认值:0、false、0.0 等。这不是“赋值操作”,而是JVM在堆内存分配时直接清零的结果——所以你写 new int[5],得到的是 {0, 0, 0, 0, 0},不是 {null, null, null, null, null}(后者语法错误,int 不能为 null)。
常见错误现象:
- 误以为
int[] arr = new int[3]后arr[0] == null—— 编译不通过,int是基本类型,不接受null - 用
== null检查基本类型数组元素是否“未设置”,实际永远为false
使用场景:适合数值累加、计数器、布尔标记位等无需显式初始化的场景;但若业务语义上“0”和“未设置”有区别(比如温度传感器初始值不该是 0℃),就得额外用标志位或改用包装类。
引用类型数组的默认值才是null,但容易混淆“数组本身”和“数组元素”
String[] strs = new String[3] 创建的是一个长度为 3 的数组对象,它本身不为 null,但它的每个元素(strs[0]、strs[1]、strs[2])初始值都是 null。这点常被忽略,导致 NullPointerException。
立即学习“Java免费学习笔记(深入)”;
常见错误现象:
-
strs[0].length()直接调用,抛出NullPointerException - 误判
strs == null为真,其实数组对象已分配,只是内容为空 - 用
Arrays.toString(strs)得到[null, null, null],误以为数组没创建成功
实操建议:
- 如果需要非
null元素,必须显式初始化,例如strs[0] = "hello"或用Arrays.fill(strs, "") - 检查元素是否可用,应写
if (strs[i] != null),而不是if (strs != null) - 注意
new Integer[3]和new int[3]的区别:前者是引用数组,默认全null;后者是基本数组,默认全0 -
Arrays.fill(new ArrayList<string>[2], new ArrayList())</string>编译通过,但运行时报ArrayStoreException - 对
int[]传入long值,如Arrays.fill(arr, 1L),编译失败(类型不匹配) -
Arrays.fill(int[], int)→ 安全,推荐用于基本类型数组 -
Arrays.fill(Object[], Object)→ 要求填充值类型与数组组件类型兼容,否则运行时报错 - 性能影响极小,内部仍是循环,但避免了手写错误,JVM 也做了优化
用Arrays.fill()批量设值比循环更安全,但注意类型擦除陷阱
Arrays.fill() 是最常用的显式初始化方式,比手写 for 循环简洁且不易越界。但它对泛型数组(如 List<string>[]</string>)无效,因为类型擦除后底层仍是 Object[],而 fill(Object[], Object) 可能引发运行时异常。
常见错误现象:
参数差异与兼容性:
示例:
int[] nums = new int[4];
Arrays.fill(nums, -1); // ✅ 安全:{ -1, -1, -1, -1 }
String[] names = new String[3];
Arrays.fill(names, "unknown"); // ✅ 安全:{ "unknown", "unknown", "unknown" }
局部变量数组不初始化就用会编译报错,成员变量则自动初始化
这是 Java 编译期检查的关键分水岭:方法内声明的数组变量(局部变量)必须显式初始化才能使用;而类字段(成员变量)即使没写 = new Xxx[n],也会按规则自动初始化为 null(引用类型)或零值数组(基本类型数组字段?不,是字段本身为 null,除非你写了初始化语句)。
容易踩的坑:
- 在方法里写
int[] arr; arr[0] = 1;→ 编译错误:“variable arr might not have been initialized” - 在类里写
int[] arr;,然后在另一个方法里直接用arr.length→ 运行时报NullPointerException(因为arr是null,不是自动分配的数组) - 误以为
private String[] cache;声明后就有了长度为 0 的数组——其实它就是null
实操建议:
- 局部数组务必用
= new Type[n]或直接初始化器(如= {1,2,3}) - 成员数组若需非
null默认值,应在声明时初始化(private int[] data = new int[10];)或在构造器中初始化 - 不要依赖“自动分配”,JVM 不会给未声明长度的引用类型数组分配空间 数组初始化这件事,真正麻烦的从来不是“怎么写语法”,而是搞清「谁负责初始化」「初始化发生在哪一层」「默认值在当前业务里算不算有效数据」——这三个问题没理清,补再多
Arrays.fill() 都可能埋雷。









