为什么我的原始数组在用作方法参数时没有被修改?

时间:2014-11-16 21:59:16

标签: java arrays

所以我有一个quick_sort方法,我正在测试这样:

public static void main(String[] args){
  int x[] = {5,4,9,6,3,4,11,99,3,4,5,2,4,7,8,34,5,34543,545,454};
  quick_sort(x,0,x.length-1);
  System.out.println(Arrays.toString(x));
  System.out.println(Arrays.toString(quick_sort(x,0,x.length-1)));
}

此方法的输出为:

  

[5,4,9,6,3,4,11,99,3,4,5,2,4,7,8,34,5,34543,545,454]

     

[2,3,3,4,4,4,4,5,5,5,7,8,9,11,34,99,454,545,34543]

我的问题是,我认为java是按值传递的,而且数组是对象。所以我不明白为什么我的两个输出都没有排序。为什么只有第二个,我返回数组,打印出来排序?当我将x传递给函数时,我不应该只收到仍然指向堆中同一对象的指针的副本吗?因此,我应该为原始指针修改我对该数组所做的任何更改。

编辑:

我发现它与x是文字这一事实有关。如果我将x声明为新的int [],则手动填充它,那么两个输出似乎都能正常工作。

这是我的快速搜索:

 public static int[] quick_sort(int arr[], int left, int right) {
if(left==right)
    return arr;
int holdLeft = left;
int holdRight = right;
int partition = left + (right-left)/2;
while(left<right){
    while(arr[left] < arr[partition])
    left++;
    while(arr[right]>arr[partition])
    right--;
    if(left <= right){
    swap(arr,left,right);
    left++;
    right--;
    }
}
if (holdLeft < right)
quick_sort(arr,holdLeft, right);
if (left < holdRight)
quick_sort(arr,left, holdRight);

return arr;
}

3 个答案:

答案 0 :(得分:2)

您的quick_sort()没有返回数组。

  

Java始终是按值传递的。困难的事情可以理解   Java将对象作为引用传递,并传递这些引用   按价值。 (Is Java "pass-by-reference" or "pass-by-value"?

答案 1 :(得分:1)

问题在于,在quick_sort()方法中,您正在创建另一个数组,并且您将更改存储在该新数组中,并返回该新数组而不是数组x或对{{x的引用1}} !!!

答案 2 :(得分:0)

您还没有将快速排序的数组作为任何内容返回。

如果您已声明int y[] = quick_sort(x, 0, x.length-1);,那么它会起作用,因为您已将已排序的数组分配给某些内容。目前你还没有把它宣布为任何东西。