编程中,有时候我们需要交换两个变量,在考试和找工作的笔试中,也经常能遇到类似的问题,于是我总结了几种交换变量的方法。
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、总结
在编程过程中,普遍用到的是第一种方式,其他方式各有各的优缺点,需要根据不同场景选择,当然交换变量的方式也不是只有这几种,根据不同的需求选择使用的即可。