錯誤示范
1. 直接交換
public class SwapNumbers {
// 直接交換
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
2. 包裝類交換
public class SwapNumbers {
// 包裝類交換
public static void swap(Integer a, Integer b) {
Integer temp = a;
a = b;
b = temp;
};
public static void main(String[] args) {
Integer a = new Integer(10);
Integer b = new Integer(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. 數組交換
public class SwapNumbers {
// 數組交換
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("交換前: a = " + arr[0] + "; b = " + arr[1]);
swap(arr);
System.out.println("交換后: a = " + arr[0] + "; b = " + arr[1]);
}
}
輸出結果:
交換前: a = 10; b = 20
交換后: a = 20; b = 10
2. 成員變量交換
public class SwapNumbers {
public int a;
public int b;
// 成員對象交換
public void swap(int a, int b) {
this.a = b;
this.b = a;
};
public static void main(String[] args) {
SwapNumbers sn = new SwapNumbers();
int a = sn.a = 10;
int b = sn.b = 20;
System.out.println("交換前: a = " + sn.a + " b=" + sn.b);
sn.swap(a, b);
System.out.println("交換前: a = " + sn.a + " b=" + sn.b);
}
}
輸出結果:
交換前: a = 10; b = 20
交換后: a = 20; b = 10
交換兩個數的方法
1. 通過臨時變量存放交換
public class SwapNumbers {
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("交換前: a = " + arr[0] + "; b = " + arr[1]);
swap(arr);
System.out.println("交換后: a = " + arr[0] + "; b = " + arr[1]);
}
}
輸出結果:
交換前: a = 10; b = 20
交換后: a = 20; b = 10
2. 通過加減計算交換
public class SwapNumbers {
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("交換前: a = " + arr[0] + "; b = " + arr[1]);
swap(arr);
System.out.println("交換后: a = " + arr[0] + "; b = " + arr[1]);
}
}
輸出結果:
交換前: a = 10; b = 20
交換后: a = 20; b = 10
3. 通過異或運算交換
public class SwapNumbers {
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("交換前: a = " + arr[0] + "; b = " + arr[1]);
swap(arr);
System.out.println("交換后: a = " + arr[0] + "; b = " + arr[1]);
}
}
輸出結果:
交換前: a = 10; b = 20
交換后: a = 20; b = 10
通過異或運算交換的原理
按位異或運算是指兩個相應的二進制相同時結果為0,否則為1。
a ^ b ^ b 、 (ab)b 和 a(bb) 結果是相同的。
主要的原理是:
(1)一個變量按位異或自己的結果為0,即:a ^ a = 0;
(2)一個變量按位異或0的結果為自己,即:a ^ 0 = a;
a = a ^ b; // 語句1
b = a ^ b; // 語句2
a = a ^ b; // 語句3
於是,在上面的三條語句中,
語句1可以看做把變量a、b保存到a的存儲空間中(當然這只是一種理解方式);
語句2消去了b(原理1),於是剩下了a(原理2),賦值到b的存儲空間,此刻,b變量已經得到了a的值;
語句3中,原本a變量存儲空間內已經同時保存了a、b,此刻,b已經變成了a,所以兩個按位異或后,便消去了a(原理1),只剩下了b(原理2),將它賦值給a,
至此,交換變量的過程結束。
總結
方式一是最常見的,可讀性高,但是需要在內存中存放臨時變量,但是對於現在來說,需要的內存空間很小,而且存放臨時變量的內存很快就會釋放,不存在問題。
方式二有缺陷,當兩個數相加之后,可能其結果超出了變量類型能表達的最大范圍,這個時候結果就會出問題,不推薦使用
方式三效率是最高的,但是可讀性不是很好。
在程序中盡可能的使用方式一,提高程序的可讀性。但是需要了解方式三,以及方式三的原理。