在项目中,经常会用到数值交换,那么数值的交换又可以有多少种情况实现呢?
前提基础:
int num1=10;
int num2=20;
System.out.println("num1="+num1+",num2="+ num2);
实现方式一:
说明:采用中间变量的方式实现,以中间变量作为中间介质进行数据交换。
int temp=num1;
num1=num2;
num2=temp;
System.out.println("num1="+num1+",num2="+ num2);
结果:
实现方式二:
//此时:num1=10;num2=20;
num1=num1+num2;
//此时:num1=30;num2=20;
num2=num1-num2;
//此时:num2=30-20=10,是原来基础数据num1的值,将其赋值给num2以达到数据交换的目的。
//num1仍然为30
num1=num1-num2;
//此时num2=10,但是num1=30-10=20,该值为基础数据中num2的值,将其赋值给num1,以达到数据交换的目的。
System.out.println("num1="+num1+",num2="+ num2);
结果:
实现方式三:
说明:采用异或的方式,因为数据都是以二进制补码的形式进行存储,异或即两位二进制数字,相同位0,不同位1.
//num1=10,num2=20
num1=num1^num2;
//此时num1为num1和num2异或的结果
num2=num1^num2;
//num1与num2异或,得到原来num1的值,将该值赋值给num2
num1=num1^num2;
//num1与原来num1的值,(即现在num2的值做异或),结果来原来num2的值,赋值给num1
结果:
比较:
优点 | 缺点 | |
---|---|---|
方式一 | 可读性强,适用于任何类型 | 需要声明一个变量,多开辟一块内存空间 |
方式二 | 省一块内存空间 | 只能是数值类型,并且如果数据过大,可能造成数据溢出,可读性差,较复杂 |
方式三 | 省一块内存空间 | 只能是数值类型,可读性差,较负责 |
总结:如果大家使用的时候建议使用第一种方式,第二种方式知道即可。