You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Java中两个数组操作方法一个无法修改原数组一个可生效?

Java数组操作方法行为差异原因解析

首先给出示例代码(注释已汉化):

public class Main{
   // 该方法无法修改外部传入的原数组
   public static void changeArr1 (int [] arr) {
        int [] tmp = {10, 20}; 
        arr = tmp; 
   }
   // 该方法可以交换数组指定下标的两个元素
   public static void swap(int[] arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
   }
}

核心差异根源:Java仅支持值传递

Java中所有参数传递给方法时,传递的都是值的副本:

  • 基本类型参数传递的是实际数值的拷贝
  • 引用类型(比如数组)参数传递的是堆内存中对象的存储地址的拷贝,也就是引用的副本

为什么changeArr1无法修改原数组

方法内部的形参arr是外部数组引用的副本,初始状态下它和外部原数组变量指向堆中的同一个数组对象。但方法中执行arr = tmp时,仅修改了这个局部副本的指向,让它指向了新创建的tmp数组,完全不会影响外部原变量的指向,也没有修改原数组的内容,因此外部看不到任何改动。

为什么swap可以修改原数组元素

swap方法全程没有修改形参arr本身的指向,而是通过这个引用直接修改它指向的堆中原数组的内部元素。由于形参和外部原数组变量指向的是同一个数组对象,因此修改结果对外部可见,交换操作生效。

内容的提问来源于stack exchange,提问作者Pompa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 21:45:08