java一维数组变量存储的是堆中数组对象的首地址,而非数据本身;声明时为null,new后指向堆内存连续空间,下标访问通过地址偏移计算,赋值或传参均为引用共享,修改元素会影响所有引用该数组的变量。

Java 一维数组的引用机制,核心在于“数组变量不存数据,只存地址”。它不是把整组数字直接装进变量里,而是让变量记住这组数据在内存中的起始位置——就像给仓库贴了一张门牌号,而不是把所有货物搬进标签纸里。
数组变量本质是引用
声明 int[] arr; 时,arr 本身只是一个空的“指针容器”,值为 null;执行 arr = new int[5]; 后,JVM 在堆内存中开辟一段连续空间(比如地址 0x1000~0x1018),存放 5 个默认为 0 的整数,然后把 0x1000 这个首地址赋给 arr。此时 arr 指向对象,而非对象本身。
- 基本类型变量(如
int a = 10;)直接存数值 10 - 数组变量(如
int[] arr)存的是堆中数组对象的地址 - 因此
arr是引用类型,哪怕它装的是int这类基本类型元素
下标访问 = 地址偏移计算
写 arr[2] 时,JVM 并不是“翻找第 3 个格子”,而是用公式:实际地址 = arr 所存地址 + 2 × 单个元素字节数(int 是 4 字节,所以偏移 8 字节)。这个过程由虚拟机底层完成,开发者只需关心逻辑下标。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 下标必须是整数,可以是变量或表达式(如
arr[i + 1]),但运行时必须 ≥ 0 且 <arr.length - 越界会立刻抛出
ArrayIndexOutOfBoundsException,这是运行时异常,编译不报错 -
arr.length是数组对象的公共属性,不是方法,不能加括号
赋值与共享指向同一块内存
当执行 int[] b = arr;,不是复制 5 个数字,而是把 arr 存的地址(如 0x1000)再交给 b。此时 arr 和 b 都指向同一段堆内存。
- 修改
b[0] = 99;,arr[0]的值也变成 99 - 改变
b = null;或b = new int[3];,只影响b的指向,arr仍指向原数组 - 若需真正复制内容,得手动循环赋值,或用
Arrays.copyOf(arr, arr.length)
静态初始化也遵循引用规则
写 String[] names = {"Alice", "Bob"}; 看似直接赋值,其实等价于:
- new 一个长度为 2 的
String[]对象(堆中) - 再 new 两个
String对象("Alice"、"Bob"),分别存入数组索引 0 和 1 的位置 - 数组每个元素存的是字符串对象的地址,不是字符串文本本身
- 所以
names[0] = "Charlie";是把索引 0 处的地址换成新字符串对象的地址
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










