空间思想
借助一个额外的内存空间完成两个数的交换,最常规也是最容易想到的方法。
public static void main(String[] args) {
int a = Integer.MAX_VALUE, b = 100;
int temp = a;
a = b;
b = temp;
System.out.println("a = " + a + ", b = " + b);
}
数学思想
不需要额外空间,只通过数学加减法就可以完成数据交换。
有人认为这种方法存在数据溢出的问题。我要纠正明确一下,在交换的过程中,单个加减法语句可能会存在溢出问题,但是最终的交换结果一定是对的。
public static void main(String[] args) {
int a = Integer.MAX_VALUE, b = 100;
a = a + b;
b = a - b;
a = a - b;
System.out.println("a = " + a + ", b = " + b);
}
二进制思想
利用二进制特性,异或操作完成数据交换
public static void main(String[] args) {
int a = Integer.MAX_VALUE, b = 100;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("a = " + a + ", b = " + b);
}
效率比较
单就整数交换这个场景而言,我用JDK8做代码测试,经过多次验证后,得到如下结论:
效率差距总体不大,略有优劣:空间方法 > 数学方法 > 二进制方法
总结
三种交换方法,反映出的是三种解决问题的思维,值得参考。