java中数组变量是引用而非数据本身,栈中存储地址,堆中存储实际元素;赋值和传参复制的是地址,导致共享修改;数组长度固定,重赋值只是改变引用指向。

Java中数组变量不是数据本身,而是指向堆内存中实际数组对象的“地址标签”。理解这一点,就能看懂为什么赋值、传参、修改看起来像“共享”,其实背后是引用在起作用。
数组变量本质是引用,不是数据
声明 int[] arr = new int[3]; 时,栈中只存一个变量 arr,它不保存数字,只存一个地址;真正的三个整数(默认为0)存在堆里。就像你写在便签上的“张三家的门牌号”,便签不是房子,只是能找到房子的线索。
- 未初始化时
int[] arr;,arr的值是null,相当于便签上写着“无地址”,此时访问arr[0]会抛NullPointerException - 执行
arr = new int[3];后,JVM 在堆中划出连续空间,并把这块空间的首地址写进arr -
arr.length是读取堆中该数组对象自带的长度信息,不是计算出来的
多个变量可指向同一块数组内存
当用 = 赋值数组变量时,复制的是地址,不是内容。两个变量从此共享同一片堆内存。
-
int[] a = {1, 2, 3}; int[] b = a;→a和b指向同一个数组 -
b[0] = 99;后,a[0]也变成 99,因为改的是堆里的那个位置 - 让其中一个变量指向别处(如
a = new int[]{4,5};),不影响另一个变量所指的内容
方法传参时传递的是引用的副本
调用 modify(arr) 时,形参获得的是实参地址的一个拷贝——但这个拷贝仍指向原数组。所以方法内能改元素,但不能让外部变量指向新数组(除非返回并重新赋值)。
- ✅ 可以:
nums[0] = 100;→ 原数组首元素被修改 - ❌ 不能:
nums = new int[]{9,8,7};→ 只改变形参副本的指向,不影响实参 - 若想替换原数组,需显式返回新数组并重新赋值:
arr = modifyAndReturn(arr);
数组长度不可变,但引用可以重定向
数组一旦创建,其长度固定。所谓“长度变了”,其实是变量换了个指向。
-
String[] names = {"张", "李"};→ 长度为 2 -
names = new String[]{"王", "赵", "陈"};→names现在指向一个新数组,长度为 3 - 原来的二元数组还在堆里(若无其他引用),等待垃圾回收
- 没有“扩容”或“缩容”操作,只有新建+重赋值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











