因为别人问了一个快速排序问题,所以复习了下算法,手头的算法书是C++的,所以自己改成java代码。

这个快速排序算法用到了c++的swap()方法,java里面没有这种方法,估计是因为太方便了不规范,所以API里没有提供。囧

自己实现的时候顺便复习了一下java的参数传递。

1. public class
2. 
3. public static void
4. int a=5;
5. int b=10;
6.     alter(a,b);
7. "a="+a);
8. "b="+b);
9.     }
10. 
11. 
12. public static void alter(int a,int
13. int
14.     b=a;
15.     a=temp;
16. "inside_a="+a);
17. "inside_b="+b);
18.     }
19. 
20. }
结果: 

1. inside_a=10
2. inside_b=5
3. a=5
4. b=10

从显示结果可以看出,alter方法内形参(parameter)的改变并不影响方法外的实参


(argument)。貌似这和c一样……囧……



当我们把例子中的int全部改为Integer封装类时,结果一样。所以可以证实java果然是传说中的值传递(pass by value)……就是说只是传个相同的值过去,怎么变这个值都和原来的没关系……囧……值传递相反的是引用传递(pass by reference)



那么怎么实现这个swap()方法呢,首先复习一下java的传递过程:



参数传递有两种情况,传递基本数据类型和传递对象(object),基本数据类型就是int,long等定义的数据,对象就是Interger,Long和用户自定义的类对象。



基本数据类型是储存在栈(stack)中。而对象的创建,如Integer test=new Integer();,则会先执行new Integer()(先执行赋值运算符右边的表达式),在堆(heap)中创建规定大小的Integer对象空间,此时这个空间为空(null)。然后执行Integer test,在栈中创建一个只能指向Integer类的、名为test的引用(reference)。然后将这个引用指向刚才定义的Integer空间。



而在参数传递时,基本数据类型和对象传递都是将栈中的内容,作为实参复制一份作为形参,所以无论怎么改变形参,都只是改编基本数据类型和对象在栈中引用的拷贝而已,不会影响到实参。



如果要实现这个Swap()方法,基于OOP思想,则创建一个Swap对象,接受参数之后,存储在对象内部,用内部方法交换数据,再把参数传回请求。


1. class
2. private int
3. private int
4. 
5. public Swap(int x,int
6. this.x=x;
7. this.y=y;
8.     }
9.     
10. public void
11. int
12.     x=y;
13.     y=temp;
14.     }
15. 
16. public int getx(){return
17. public int gety(){return
18. }
19. 
20. 
21. public class
22. public static void
23. int
24. int
25. 
26. out.println("x="+x);
27. out.println("y="+y);
28. 
29. new
30.     temp.doSwap();
31. 
32.     x=temp.getx();
33.     y=temp.gety();
34. 
35. out.println("after swap x="+x);
36. out.println("after swap y="+y);
37.     }
结果: 

1. x=5
2. y=10
3. after swap x=10
4. after swap y=5