实例化是分配内存空间,初始化是填充数据;声明int[] arr仅创建null引用,new int[5]才实例化并自动初始化为0,arr[0]=10为显式初始化。

先搞清“实例化”和“初始化”不是一回事
很多人卡在“数组怎么就是空的”“length 报空指针”,根源是混淆了两个动作:实例化是给数组分配内存空间,初始化是往那块空间里填数据。声明一个 int[] arr; 只是建了个“空盒子标签”,arr 还是 null;执行 arr = new int[5]; 才真正造出 5 个格子(自动填满 0);再写 arr[0] = 10; 才算完成一次显式初始化。
五种常用初始化方式,按场景选
静态初始化(一步到位)
适合已知全部元素值、数量固定的情况,比如配置项、状态码列表:
int[] codes = {200, 404, 500};
String[] roles = new String[]{"admin", "user", "guest"};
动态初始化(先占位,后填数)
适合长度确定但内容需计算、读取或逐步生成:
int[] data = new int[100];
for (int i = 0; i
匿名数组(只用一次,不命名)
常用于方法调用传参,避免多写变量:
printNames(new String[]{"Alice", "Bob"});
分步初始化(调试友好)
声明和实例化分开,方便断点观察中间状态:
double[] temps;
temps = new double[7]; // 先分配
temps[0] = 23.5; temps[1] = 24.1; // 再赋值
默认初始化(不写也生效)
只要完成实例化,JVM 就会自动填默认值:
boolean[] flags = new boolean[3]; // → [false, false, false]
String[] refs = new String[2]; // → [null, null]
三个容易踩的坑,必须避开
• 声明后直接用 length 或下标访问:int[] a; System.out.println(a.length); → NullPointerException
• 混合写法编译失败:new int[3]{1,2,3} 是非法语法,长度和元素不能同时硬编码
• 忘记默认值影响逻辑:int[] scores = new int[5]; 后没赋值就统计“非零成绩人数”,结果全算成 0 分——其实只是还没填数
需要扩容?数组本身做不到
Java 数组一旦 new 出来,长度就锁死。想“加元素”得手动创建新数组、复制旧数据:
int[] old = {1, 2, 3};
int[] expanded = Arrays.copyOf(old, old.length + 1);
expanded[3] = 4;
如果频繁增删,建议换用 ArrayList,它底层自动处理扩容逻辑。


















