java数组的length是public final字段而非方法,访问为o(1),反映创建时物理容量且不可修改;使用前必须判空,多维数组中仅表示最外层长度。

Java 数组的 length 是一个公共 final 字段,不是方法,访问开销为 O(1),无需缓存;它反映创建时的物理容量,不可修改,使用前必须判空,多维数组中仅表示最外层大小。
length 是字段,不是方法
数组的 length 在 JVM 内存布局中是硬编码的整数字段,直接映射到对象头后固定偏移处。编译器将其识别为字段访问,而非方法调用。
-
✅ 正确写法:
int len = arr.length; -
❌ 编译错误:
int len = arr.length();(报错:Cannot resolve method 'length()') -
❌ 编译错误:
arr.length = 10;(报错:Cannot assign a value to final variable 'length') - 别和
String.length()或List.size()混用——三者语义、实现机制完全不同
多维数组的 length 只管“第一层”
二维数组本质是一维数组,其元素类型是“一维数组引用”。因此 matrix.length 返回的是行数,而非总元素数或列数。
-
int[][] m = {{1,2}, {3,4,5}};→m.length == 2,m[0].length == 2,m[1].length == 3 - 遍历时外层用
i ,内层必须用 <code>j - 不能假设
matrix[0].length对所有行都适用——不规则数组(ragged array)下极易越界 - 访问
matrix[i].length前,需确保matrix != null且i有效,且matrix[i] != null
空数组与 null 数组必须区分处理
空数组(new int[0])的 length 是 0,可安全访问;而 null 数组访问 length 会立即抛出 NullPointerException。
-
✅ 安全写法:
if (arr != null && arr.length > 0) { ... } -
❌ 危险写法:
if (arr.length > 0) { ... }(arr 为 null 时崩溃) - 常见高危场景:方法参数未校验、JSON 反序列化结果为 null、集合中存放的数组未初始化
- 建议在工具类或公共方法入口做显式判空,避免把风险传递到下游
性能上无需缓存,但边界逻辑要写对
JVM 对 arr.length 的读取已高度优化,JIT 可能直接内联,反复访问无实际开销。真正影响性能的是错误的循环条件或冗余判断。
-
✅ 推荐循环写法:
for (int i = 0; i -
❌ 典型越界错误:
for (int i = 0; i (多跑一次,索引越界) - 增强 for 循环(
for (int x : arr))自动规避索引错误,适合纯遍历场景 - 扩容操作无法绕过新建数组:用
Arrays.copyOf(arr, newLen)或System.arraycopy(),比手写循环更高效可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











