Java中交换两个变量的几种方式

编程中,有时候我们需要交换两个变量,在考试和找工作的笔试中,也经常能遇到类似的问题,于是我总结了几种交换变量的方法。

1、通过第三个变量进行交换

这是最简单、最常用、最容易理解的一种交换方法,通过将需要交换的变量存放到一个临时变量中,进行交换,形象的比喻就是假如我要和姐姐换房间,我需要把我房间里的东西腾空,就是把我房间里的东西放到客厅中,然后把姐姐房间中的物品放到我房间中,再把我的物品放到姐姐原本的房间中,就完成了房间的交换,在代码中实现就是:

public class Test06 {
	public static void main(String[] args) {
		int a = 10;
		int b = 5;
		int c ;
		
		c = a ;
		a = b ; 
		b = c ;
		System.out.println("a=" + a + ",b="+b);		
	}
        //控制台输出a=5,b=10
}

原理:

这样就完成了两个变量的交换,具体的含义就是先把a的值赋值给临时变量c,再将b的值赋值给a,此时就将b的值换到了a,最后将临时变量c中的值(a的值)赋值给b,就完成了一次交换。

2、利用加减法进行交换(1)

不通过第三个变量进行交换的方式,一行代码完成交换,简洁明了。

public class Test07 {
	public static void main(String[] args) {
		int a = 10;
		int b = 5 ;
		
		a = a + b - (b = a);
		System.out.println("a=" + a + ",b="+b);	
	}
	//控制台输出a=5,b=10
}

原理:

做计算时从左往右,先将a和b求和,括号中将a的值赋值给b,就相当于括号中就是a,a+b-a=b,再将b的值赋值给a,就完成了交换。

3、利用加减法进行交换(2)

这种方式和2有点类似,也是通过加减法进行交换,但是在使用时要注意数据类型的转换以及数据在加法之后是否溢出,避免不必要的麻烦。

public class Test08 {
	public static void main(String[] args) {
		int a = 10;
		int b = 5;
		
		a = a + b;
		b = a - b;
		a = a - b;
		System.out.println("a=" + a + ",b="+b);	
	}
	//控制台输出a=5,b=10
}

原理:

将a和b求和,赋值给a,a-b实际上是a的值,赋值给b,此时b已经变成了a的值,那么a和b的和减去a的值就是b,再通过赋值运算符把b的值赋值给a,就完成了交换。

4、利用乘除法进行交换

这种方式类方式3大同小异,在使用时也要注意数据是否溢出,并且两个变量均不能为0,0不能作为分母。

public class Test09 {
	public static void main(String[] args) {
		int a = 10 ;
		int b = 4 ;
		
		a = a * b;
		b = a / b;
		a = a / b;
		System.out.println("a=" + a + ",b="+b);	
	}
	//控制台输出a=5,b=10
}

原理:

将a和b的积赋值给a,此时ab的积除b就是a,将a的值通过赋值运算符赋值给b,此时b的值就是原本a的值,这时再将ab的积(a)除b,因为b的值已经被赋值成原本a的值,那么ab的积除b就是原本b的值,再将b的值赋值给a,就完成了交换

5、通过异或运算交换两个数

位运算效率比普通的加减乘除高,在适应的场景下可以采用异或运算,但是这种方式不能用来交换两个相同的变量。

public class Test10 {
	public static void main(String[] args) {
		int a = 10;
		int b = 5;
		
		a = a ^ b;
		b = a ^ b;
		a = a ^ b;
		System.out.println("a=" + a + ",b="+b);	
	}
	//控制台输出a=5,b=10
}

原理:

  • 异或满足交换律和结合律
  • a ^ a == 0
  • a ^ 0 == a

在本例中,交换流程可以用下表来表示

a

b

a = a ^ b

a ^ b

b

b = a ^ b

a ^ b

a ^ b ^ b == a

a = a ^ b

a ^ b ^ a == b

a

结果

b

a

6、总结

在编程过程中,普遍用到的是第一种方式,其他方式各有各的优缺点,需要根据不同场景选择,当然交换变量的方式也不是只有这几种,根据不同的需求选择使用的即可。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注