黑马程序员技术交流社区

标题: 数组排序时的交换方法问题 [打印本页]

作者: 左建飞    时间: 2012-7-24 17:59
标题: 数组排序时的交换方法问题
  1. public static void selectSort(int[] arr)
  2. {
  3.     for (int x = 0; x < arr.length-1; x++)
  4.       {
  5.            for (int y = x+1; y < arr.length; y++)
  6.                  {
  7.                      if (arr[x]>arr[y])
  8.                          {
  9.                               ChangePlace.changePlace2(arr[x],arr[y]);
  10.                          }
  11.                  }
  12.         }
  13.         }
复制代码
以上为我的排序方法。调用了ChangePlace类中的交换方法。
  1. public class ChangePlace
  2. {
  3.         public static void changePlace(int[]arr,int a,int b)
  4.   {
  5.      int temp;
  6.      temp=arr[a];
  7.      arr[a]=arr[b];
  8.      arr[b]=temp;
  9.   }
  10.         public static void changePlace2(int a,int b)
  11.   {
  12.      int temp=a;
  13.      a=b;
  14.      b=temp;
  15.   }
  16. }
复制代码
这两个交换位置的方法只有changePlace才起作用,数组会排序,但是用changePlace2时就不起作用,数组不会排序。
这是为什么?

作者: 肖琦    时间: 2012-7-24 18:06
在方法changePlace(int[]arr,int a,int b)中,参数arr是引用传递,所以你在方法内部对arr作的改动是有效的。
但是changePlace2(int a,int b)中的a和b都是值传递,实质是相当于在方法内部又声明了两个变量a和b,你对他们的改动是不会影响到外面的数据的。

希望对你有帮助........

作者: 古银平    时间: 2012-7-24 18:06
changePlace2中你只传递了两个形式参数,根本没有数组,怎么交换数组的元素呢,形参和实参,在changePlace2中是交换了两个形参,你没有传递数组,那么只是两个变量的交换,与数组没关系。
作者: 王志明    时间: 2012-7-24 18:08
changePlace(int[]arr,int a,int b)中参数arr是引用传递
但changePlace2(int a,int b)中参数都值传递

作者: 周玉龙    时间: 2012-7-24 18:36
这里涉及到引用数据类型和基本数据类型的作为参数的值传递是否发生改变。
java中其实只有值传递。当参数是基本数据类型的时候,他传递的是基本数据类型的值。
当参数是引用数据类型时,比如你里面的数组在某个角标的值。他传递的是引用数据类型的数据的
地址值。所以就产生你你这里的问题。当把数组里面的arr[x]或arr[y],作为参数传递时,传递的是
他在堆内存中的地址值。所以直接修改了堆内存中的数据。当方法用完了退栈了他已保存,
而你的changePlace2方法传递的是基本数据类型的数,int型的。他传进去的arr[x]或arr[y] 直接转成int型的数。
再运行方法。他的生命周期只在方法运行时,当这个方法运行完了,退栈了,他也就消失了,而没有指向堆内存。
所以他们的值并没有换。所以changePlace2无法实现。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2