选静态初始化还是动态初始化,关键看数据确定时机:值在编译时已知用静态(如int[] a = {1,2,3}),长度已知但内容需运行时获取则用动态(如int[] a = new int[5])。

选静态还是动态,关键看数据什么时候能确定、怎么来。值在写代码时就全知道,用静态;长度清楚但内容要运行时填,就用动态。
静态初始化:适合写死的数据
当你手头有一组固定值,比如配置项、测试用例或枚举列表,直接用大括号写进去最干净:
-
标准写法:
int[] scores = {85, 92, 78};—— 编译器自动算出长度是3,不用写[3] -
兼容写法:
String[] roles = new String[]{"admin", "user", "guest"};—— 多用于方法传参或三元表达式中 -
不能拆开:
int[] a;然后a = {1, 2};会编译失败,大括号必须和声明同行,或配合new -
类型要一致:不能混写
{1, "hello"},也不能在末尾多加逗号(虽部分编译器容忍,但易引发警告)
动态初始化:适合运行时才有的内容
当数组长度已知,但每个元素得从用户输入、文件读取或计算生成时,先划好地盘再填内容:
-
基本形式:
double[] temps = new double[7];→ 分配7个位置,每个默认为0.0 -
引用类型注意:
String[] users = new String[3];→ 长度是3,但三个元素都是null,不是空字符串 -
长度要合法:可用变量或表达式,如
new int[x + y],但不能为负,否则抛NegativeArraySizeException -
别忘了赋值:声明后不填值就直接用
arr[0],会触发NullPointerException(如果元素是引用类型)或逻辑错误(如果是基本类型但本意不是0)
怎么判断该用哪一种?看来源和后续操作
不靠背规则,靠问两个问题:
- 这些值在编译时就能写出来吗?→ 是,就静态初始化
- 数组长度现在就知道,但具体值要等程序跑起来才能拿到?→ 是,就动态初始化 + 循环/IO/计算赋值
- 想让数组引用不可变?加
final,如final int[] conf = {1, 2, 3};(注意:元素仍可改,只是不能指向新数组) - 需要增删元素?数组本身不支持,该换
ArrayList或手动扩容
几个容易踩的坑
细节小,但一错就卡半天:
-
打印数组别直接
System.out.println(arr)→ 输出的是哈希码,要用Arrays.toString(arr) -
基本类型数组转List别用
Arrays.asList(arr)→int[]会被当单个对象,结果是个含一个元素的列表;应先转包装类或用Stream -
数组赋值是引用传递:
int[] b = a;后改b[0],a[0]也跟着变;要独立副本,用a.clone()或Arrays.copyOf(a, a.length) -
下标永远从0开始,最大有效索引是
length - 1,越界直接抛ArrayIndexOutOfBoundsException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











