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

标签 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, 6, 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;
}

最佳答案

您的quick_sort() 不返回数组。

Java is always pass-by-value. The difficult thing can be to understand that Java passes objects as references and those references are passed by value. (Is Java "pass-by-reference" or "pass-by-value"?)

关于java - 为什么我的原始数组在用作方法参数时没有被修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26962531/

相关文章:

c++ - 如何在 C++ 中追加字节数据?

Java - 将给定的小数组粘贴到指定位置(或间隔)的另一个更大的数组中

Java Swing ;在 if 语句或 do-while 语句之间选择?

java - 如何在 Eclipse 中使用相对路径读取和打印文件?

java - 错误 backtype.storm.daemon.executor - java.lang.NoClassDefFoundError : org/I0Itec/zkclient/serialize/ZkSerializer

c# - 在 C# 中将 decimal[][] 转换为 double[][]

javascript - 对象格式化 - .map 正在删除我的第一行

javascript - 为什么带有 some 方法的三元运算符会使该语句为假?

java - 在 Java 中标记接口(interface)

java - 从 onPostExecute 中的另一个类调用方法导致 nullPointerException