Java基础:交换两数的方法
Java 在有参函数调用时,如果参数传递的是基本类型,进行的是 值传递,而不是 地址 或 引用传递。
1、【错误示范】
1.1、直接交换
public class SwapNumber {
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("交换前:a = " + a + ", b = " + b);
swap(a, b);
System.out.println("交换后:a = " + a + ", b = " + b);
}
}
输出结果:
交换前:a = 10, b = 20
交换后:a = 10, b = 20
1.2、包装类交换
public class SwapNumber {
public static void swap(Integer a, Integer b) {
Integer temp = a;
a = b;
b = temp;
}
public static void main(String[] args) {
Integer a = 10;
Integer b = 20;
System.out.println("交换前:a = " + a + ", b = " + b);
swap(a, b);
System.out.println("交换后:a = " + a + ", b = " + b);
}
}
输出结果:
交换前:a = 10, b = 20
交换后:a = 10, b = 20
2、【正确示范】
2.1、数组 + 临时变量
public class SwapNumber {
public static void swap(int[] arr) {
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
public static void main(String[] args) {
int[] arr = {10, 20};
System.out.println("交换前:arr[0] = " + arr[0] + ", arr[1] = " + arr[1]);
swap(arr);
System.out.println("交换后:arr[0] = " + arr[0] + ", arr[1] = " + arr[1]);
}
}
输出结果:
交换前:arr[0] = 10, arr[1] = 20
交换后:arr[0] = 20, arr[1] = 10
2.2、数组 + 加减计算
public class SwapNumber {
public static void swap(int[] arr) {
arr[0] = arr[0] + arr[1];
arr[1] = arr[0] - arr[1];
arr[0] = arr[0] - arr[1];
}
public static void main(String[] args) {
int[] arr = {10, 20};
System.out.println("交换前:arr[0] = " + arr[0] + ", arr[1] = " + arr[1]);
swap(arr);
System.out.println("交换后:arr[0] = " + arr[0] + ", arr[1] = " + arr[1]);
}
}
输出结果:
交换前:arr[0] = 10, arr[1] = 20
交换后:arr[0] = 20, arr[1] = 10
2.3、数组 + 异或运算
- 一个数异或 自己 的结果为 0
- 一个数异或 0 的结果为 自己
- 一个数异或 1 的结果为 自己的反码
public static void swap(int[] arr) {
arr[0] = arr[0] ^ arr[1];
arr[1] = arr[0] ^ arr[1];
arr[0] = arr[0] ^ arr[1];
}
public static void main(String[] args) {
int[] arr = {10, 20};
System.out.println("交换前:arr[0] = " + arr[0] + ", arr[1] = " + arr[1]);
swap(arr);
System.out.println("交换后:arr[0] = " + arr[0] + ", arr[1] = " + arr[1]);
}
输出结果:
交换前:arr[0] = 10, arr[1] = 20
交换后:arr[0] = 20, arr[1] = 10
异或运算交换两数的原理:
按位异或运算是指:数字在二进制形式上,同位上进行比较,相同为 0,不同为 1。
即 1 ^ 1 == 0、1 ^ 0 == 1、0 ^ 1 == 1、0 ^ 0 == 1
a = a ^ b; // 语句 1
b = a ^ b; // 语句 2
a = a ^ b; // 语句 3
- 语句 1 可以看做把变量 a、b 的值临时存储到变量 a 中(一种理解方式——
- 语句 2 利用 b ^ b == 0 消去了 b,也就是 b = a
- 语句 3 也是利用 自己异或自己等于 0,消去了 a,从而 a = b
2.4、成员变量
public class SwapNumber {
int a;
int b;
public void swap(int a, int b) {
this.a = b;
this.b = a;
}
}
class SwapNumberTest {
public static void main(String[] args) {
SwapNumber obj = new SwapNumber();
obj.a = 10;
obj.b = 20;
System.out.println("交换前:a = " + obj.a + ", b = " + obj.b);
obj.swap(obj.a, obj.b);
System.out.println("交换后:a = " + obj.a + ", b = " + obj.b);
}
}
输出结果:
交换前:a = 10, b = 20
交换后:a = 20, b = 10
3、总结
-
【数组 + 临时变量 】是最常见的,可读性高,但是需要在内存中存放临时变量,但是对于现在来说,需要的内存空间很小,而且存放临时变量的内存很快就会释放,不存在问题。
-
【数组 + 加减计算】 有缺陷,当两个数相加之后,可能其结果超出了变量类型能表达的最大范围,这个时候结果就会出数据溢出,不推荐使用!
-
【数组 + 异或运算】 效率是最高的,但是可读性不是很好。
-
在程序中尽可能的使用 【临时变量】,提高程序的可读性。但是需要了解加减计算以及异或运算的原理。
本文探讨了在Java中错误地交换两个数的方法,如直接交换和使用包装类,然后详细介绍了正确的交换方法,包括使用临时变量、数组加减计算和异或运算。重点解析了异或运算交换的原理,强调了在实际编程中,虽然异或运算效率高,但为了代码可读性,推荐使用临时变量。同时提醒注意加减计算可能导致的数据溢出问题。
7119

被折叠的 条评论
为什么被折叠?



