如何用java实现swap函数?

Life is short , play more!
本文来自lihao's Blog,转载请注明。

c语言中很好实现, 大学c语言如今已经成为了基本必修课(包括文科学生据说也是必修课之一). c语言中实现swap交换2个int类型变量, 需要用到指针, 因为这样才能有效的改变实参内容. 那么java能否实现呢?

如果我们不用object和数组,那么无法实现(即无法实现基本数据类型的转换),但却明显提高了java语言的安全性.

那么我们来看下java的函数是如何进行参数的传递的.到底是通过引用还是通过变量内容值.

public void tricky(Point arg1, Point arg2)
{
  arg1.x = 100;
  arg1.y = 100;
  Point temp = arg1;
  arg1 = arg2;
  arg2 = temp;
}
public static void main(String [] args)
{
  Point pnt1 = new Point(0,0);
  Point pnt2 = new Point(0,0);
  System.out.println("X: " + pnt1.x + " Y: " +pnt1.y); 
  System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
  System.out.println(" ");
  tricky(pnt1,pnt2);
  System.out.println("X: " + pnt1.x + " Y:" + pnt1.y); 
  System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);  
}

执行完毕后,我们砍下输出结果。

X: 0 Y: 0
X: 0 Y: 0
X: 100 Y: 100
X: 0 Y: 0

可以发现,swap函数中,可以把pnt1中的数据进行改变,但是将pnt1和pnt2进行交换却没有成功。这是我们困惑的主要原因。 那我们通过这几张图来看一下为什么。

original reference 就是pnt1, 则method reference 就是swap函数中的arg1。我们可以看到他们都引用得同一个对象。 下图是在进行swap和swap之后的,对象以及引用的状态图。

可以发现,只是交换了arg2和arg1引用到的对象,其实对象的值并没有发生实际改变。

那么我们如何来改造这个函数呢。

public void tricky(Point arg1, Point arg2)
{
  arg1.x = 100;
  arg1.y = 100;
  Point temp = new Point(0,0);
  temp.x = arg1.x;
  temp.y = arg1.y;
  arg1.x = arg2.x;
  arg1.y = arg2.y;
  arg2.x = temp.x;
  arg2.y = temp.y;
}

 


发表评论

电子邮件地址不会被公开。 必填项已用*标注