arrays.copyof(arr, 0)天然返回长度为0的新数组,无论arr非空、空数组或null(此时抛npe属预期行为),比new t[0]更类型安全、可复用且语义统一。

直接用 Arrays.copyOf(arr, 0) 就是最简洁、最安全的方式,无需额外判空或新建数组。
为什么 copyOf(arr, 0) 天然适配空数组
无论原数组是 null、长度为 0,还是正常非空,Arrays.copyOf(arr, 0) 都能稳定返回一个长度为 0 的新数组:
- 当
arr == null:抛出NullPointerException—— 这是预期行为,应由上层处理或提前校验; - 当
arr.length == 0:返回一个新的String[0](或对应类型)空数组; - 当
arr.length > 0:截取前 0 个元素,结果仍是空数组。
对比手动创建空数组的缺点
写 new String[0] 看似简单,但容易带来维护和一致性问题:
- 类型需显式声明,泛型场景下易出错(如
new List<string>[0]</string>不合法); - 重复创建对象,无法复用同一实例,影响内存与 GC 压力;
- 不同方法里分散写,难以统一替换或注入(比如后续想改用不可变空数组)。
推荐的稳健写法(含 null 安全)
生产代码中建议组合静态常量 + copyOf,兼顾性能与健壮性:
- 定义一个
private static final String[] EMPTY = new String[0];; - 遇到可能为
null的输入时,先判空再返回该常量; - 对非空数组做逻辑处理后,统一用
Arrays.copyOf(result, newLength),其中newLength可为 0。
copyOfRange 更适合“切片后可能为空”的场景
如果逻辑本质是“去掉头几个元素”,比如丢弃顶部牌、跳过前缀,用 Arrays.copyOfRange(arr, from, arr.length) 更语义清晰:
-
from ≥ arr.length时自动返回空数组,不抛异常; - 内部已做边界防护,比手写
if (arr.length 更扁平; - 配合
static final空数组复用,零开销。











