下面介绍2个变量交换的3种方式。
1 . 普通方法。
见代码:
/**
*
*/
package huati15;
/**
* @author Vayne
*
*/
public class SwapTest {
public static void main(String[] args) {
int i = 5;
int j = 7;
swap(i, j);
System.out.println(i);
System.out.println(j);
Value va = new Value(i, j);
swap(va);
System.out.println(va.i);
System.out.println(va.j);
}
/**
* @param va
*/
private static void swap(Value va) {
// TODO Auto-generated method stub
int temp = va.i;
va.i = va.j;
va.j = temp;
}
/**
* @param i
* @param j
*/
private static void swap(int i, int j) {
// TODO Auto-generated method stub
int temp = i;
i = j;
j = temp;
}
}
class Value {
int i;
int j;
public Value(int i, int j) {
// TODO Auto-generated constructor stub
this.i = i;
this.j = j;
}
}
运行结果:
5
7
7
5
形参的改变是不能反作用于实参的。但是可以通过引用来改变成员变量的值。
2 . 相加与相减的方法
有的时候在不能引入第三个变量的前提下去交换2个变量的值,但是会产生溢出问题。可以使用下面的方法:
/**
*
*/
package huati15;
/**
* @author Vayne
*
*/
public class SwapTest2 {
public static void main(String[] args) {
int i = 5;
int j = 7;
Value value = new Value(i, j);
swap2(value);
System.out.println(value.i);
System.out.println(value.j);
}
/**
* @param i
* @param j
*/
private static void swap2(Value value) {
// TODO Auto-generated method stub
value.i = value.i + value.j;
value.j = value.i - value.j;
value.i = value.i - value.j;
}
}
运行结果:
7
5
这是利用2个数和的方法,我们同理也可以使用2个数差的方法。不再做介绍。
3 . 位运算实现变量交换
位异或运算符有这样的性质:(x^y^y)=x。因此可以利用这个性质去交换变量,在这个过程中也没有使用第三方变量。
代码如下:
/**
*
*/
package huati15;
/**
* @author Vayne
*
*/
public class SwapTest3 {
public static void main(String[] args) {
Value value1 = new Value(5, 10);
swap3(value1);
System.out.println(value1.i);
System.out.println(value1.j);
}
/**
* @param i
* @param j
*/
private static void swap3(Value value) {
// TODO Auto-generated method stub
value.i = value.i ^ value.j;
value.j = value.i ^ value.j;
value.i = value.i ^ value.j;
}
}
结果:
10
5
这方法较好。不会产生溢出问题。