【问题标题】:Modifying an Array Passed as an Argument in Java修改在 Java 中作为参数传递的数组
【发布时间】:2014-11-11 00:38:19
【问题描述】:

为什么会这样,按排序顺序显示array?:

Integer[] array={7,5,9,3,6,0,2,4};

MergeSort.mergeSort(array,0,7);

System.out.println(Arrays.toString(array));

具体来说,为什么将array 传递给公共静态void 方法mergeSort 最终会修改数组本身?我认为 Java 可以避免这种情况。例如这段代码:

  public static void main(String[] args){
    int c=2;
    change(c);
    System.out.print(c);
  }
  public static void change(int c){
    c=4;
  }

返回 2 而不是 4。我很困惑为什么 Java 允许您修改作为参数传递的数组,而不是 int

【问题讨论】:

    标签: java methods encapsulation


    【解决方案1】:

    因为 Java 是按值传递的,当您传递 Object(并且数组是 Object)时,您会将引用的值传递给 Object。相反,原语没有引用,因此您只需传递值。

    编辑

    同样,您也可以使用内置的Arrays.sort() 方法对数组进行排序。 Java 数组不是原始类型。在 Java 中,原始包装类型是不可变的(如 String)。考虑一下,

    private static void change(String in) {
        in = in + " World"; // <-- modifies in here, can't change caller's reference.
    }
    
    private static void change(StringBuilder in) {
        in.append(" World"); // <-- uses reference from caller.
    }
    
    public static void main(String[] args) {
        String str = "Hello";
        StringBuilder sb = new StringBuilder(str);
        change(str);
        change(sb);
        System.out.println("one: " + str);
        System.out.println("two: " + sb);
    }
    

    【讨论】:

    • 这个答案真的完整吗? hexafraction 的错误答案表明对此还有很多话要说,因为仅仅用数组替换 c 不会改变任何事情
    • @Dici 为什么Java允许您修改作为参数传递的数组,而不是int?因为int 是一个原语。并且包装器类型是不可变的。
    • 是的,但不像 hexafraction 所暗示的那样。如果是对象,则必须对其调用副作用方法,如果是数组,则必须直接为a[i]赋值。 myParameter = someNewValue;没有效果,我觉得这里解释一下很重要。
    【解决方案2】:

    使用数组时,无论是否作为参数,请考虑arr[i] 是指向内存某个位置的指针。然后,当接收一个数组作为参数时,你有一个指向同一个数组对象的新引用。这意味着在您的方法中,诸如:

    myParameterArray = new int[5];
    

    不会修改输入数组,因为您只是更改引用的值,而不是它指向的值。然而,诸如:

    myParameterArray[i] = 5;
    

    将直接修改您的输入数组。这就是像Arrays.sort 这样的方法的工作原理。

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 2018-01-20
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      相关资源
      最近更新 更多