java数组是堆中真实对象,继承object,具备length等属性和方法;基本类型数组存数值,引用类型数组存地址;长度固定不可变,访问o(1)且带边界检查。

Java 中数组的特殊性,核心在于它既是引用数据类型,又承担着“容器”功能,但又和 List、Map 等集合类有本质区别。
数组是对象,不是语法糖
声明 int[] arr = new int[5]; 时,arr 不是指向栈上连续内存的指针,而是一个堆中真实对象的引用。这个对象本身继承自 Object,拥有自己的 length 属性、getClass()、clone() 等方法。哪怕存的是基本类型(如 int),整个数组结构仍是堆中的对象。
元素类型统一,但存储方式分两类
数组强制要求所有元素类型一致,但底层存储逻辑不同:
- 基本类型数组(如
int[]):堆中直接存数值,连续排列,无装箱开销 - 引用类型数组(如
String[]):堆中存的是对象引用(地址),实际对象在别处,数组只管“指向谁”
长度固定,但“不可变”仅指容量
length 是 final 字段,创建后无法修改——这不是语法限制,而是 JVM 层面对该字段的保护。这意味着你不能写 arr.length = 10;,也不能通过任何方式让原数组“变长”。若需扩容,必须新建数组并复制内容,比如用 Arrays.copyOf() 或手动循环赋值。
索引快,边界严,没有自动装箱/泛型擦除
得益于连续内存布局,arr[i] 是 O(1) 随机访问:JVM 直接计算偏移量定位。同时每次访问都会做边界检查(i >= 0 && i ),越界立即抛 <code>ArrayIndexOutOfBoundsException。它不依赖泛型机制,不存在类型擦除问题;编译期就能确保 int[] 里只能放 int 值或字面量,类型安全由数组本身保障,而非泛型系统。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











