在进行开发时,往往需要对两个整数变量进行交换,可采用以下三种方法:
1、借助临时变量;
public static void swap1(int a,int b ){ System.out.println("原始值:"+a+","+b); int temp =a ; a = b; b = temp; System.out.println("交换后:"+a+","+b); }
此种方式比较好理解,在开发时可直接使用。但在面试中使用,似乎显得低端。
2、借助“先加后减”操作,不生成临时变量。
1 public static void swap3(){ 2 int a=Integer.MAX_VALUE; 3 int b = Integer.MAX_VALUE-1; 4 System.out.println("原始值:"+a+","+b); 5 a =a+b; 6 b= a-b; 7 a =a-b; 8 System.out.println("交换后:"+a+","+b); 9 }
使用此种方法时,注意加减的次序。
另外一点,有人说在使用这种方法时需要注意数值越界的问题。为验证此问题,将a和b的值都是设为整型最大值,结果仍无误,此说法似乎有误。
3、借助异或
public static void swap2 (int a ,int b){ System.out.println("原始值:"+a+","+b); a = a^b; b = b^a; a = a^b; System.out.println("交换后:"+a+","+b); }
其实现原理是进行异或操作的数学性质。如下
1.任一变量X与其自身进行异或结果为0,即 X^X=0
2.任一变量X与0进行异或结果不变,即 X^0=X
3.异或运算具有可结合性,即 a^b^c = (a^b)^c = a^(b^c)
4.异或运算具有可交换性,即 a^b = b^a。
在异或性质的基础之前进行操作,实现交换的执行过程为:
a = a ^ b ==> a = a ^ b;//获得异或值,赋值给a
b = a ^ b ==> (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a,//将上一步异或后的a带入,获得b
a= a ^ b ==> (a ^ b) ^ b = (a ^ b) ^ a = a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b, 该值赋值给a,即 a = b