java方法传对象数组是值传递,传递的是数组引用的副本,不发生拷贝;修改元素状态或引用会影响外部,但重赋值数组变量不会;浅拷贝需显式调用clone等,深拷贝需手动重建每个元素。

Java中方法参数传递对象数组时,既不是深拷贝,也不是浅拷贝——根本就没有拷贝发生。它只是把数组的引用(即内存地址)传给了方法,属于值传递(传的是引用的值)。
参数传递的本质是“传引用的副本”
Java所有参数传递都是值传递。对对象数组而言,传入方法的不是数组本身,而是指向该数组对象的引用的一个副本。这个副本和原引用指向堆中同一个数组对象,因此:
- 方法内对数组变量重新赋值(如
arr = new Person[5])不会影响外部原数组 - 但方法内通过
arr[i].setName("X")修改某个元素对象的状态,外部会立即看到变化 - 方法内调用
arr[0] = new Person(...)会改变该位置的引用,外部对应下标也会随之指向新对象
为什么不是浅拷贝?
浅拷贝需要显式调用 clone()、Arrays.copyOf() 等操作,产生一个新的数组对象。而方法参数传递不创建新数组,原数组对象在堆中始终唯一,只是多了一个引用指向它。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
什么情况下才真正触发拷贝?
只有你主动写代码复制时才会发生:
-
Person[] copy = original.clone();→ 新数组,但元素仍共享(浅拷贝) -
Person[] deep = Arrays.stream(original).map(p -> new Person(p.getName(), p.getAge())).toArray(Person[]::new);→ 每个元素都新建(深拷贝) -
System.arraycopy(original, 0, dest, 0, len)→ 同 clone(),只复制引用
大数组传参的性能与风险
传引用本身开销极小(通常8字节),所以即使数组含百万个对象,参数传递也很快。但风险在于:
- 方法内部若意外修改了某个对象的状态,调用方数据被静默污染
- 多线程环境下,若未同步,可能引发并发修改问题
- 若需隔离,应在调用前明确决定:是传原引用(轻量但需信任方法),还是提前做深拷贝(安全但耗资源)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










