又看到了請指標和引用的部分,又會有經典的swap()方法的實現。幾乎所有人都知道了,要實現一個正確的swap()方法需要以指標或引用為參數,例如:
C代碼
- //使用指標
- void swap(int* a, int* b){
-
- int tmp = *a;
- *a = *b;
- *b = tmp;
-
- }
-
- //使用引用
- void swap(int& a,int& b){
-
- int tmp = a;
- a = b;
- b = tmp;
-
- }
突然就想到,在Java中需要怎麼實現這個過程呢?Java中沒有所謂的指標和引用的概念,並且Java中所有的傳遞都是值傳遞,也就是說,下面的方法在Java中同樣沒有效:
Java代碼
- void swap(int a, int b){
- int tmp = a;
- a = b;
- b = tmp;
- }
所以這是相當尷尬的事。為了實現一個正確的交換過程,好像必須做一些更複雜的事。
如果a,b是類中兩個成員變數,那可以直接寫如下方法:
Java代碼
- int a = 4;
- int b = 5;
-
- public void swap(){
- int tmp = a;
- a = b;
- b = tmp;
- }
因為Java中所有的方法、變數必須在一個類中聲明,所以此時a,b和swap()在同一個類中,因此不需要傳遞參數,在swap()方法中就直接引用對象的成員變數。
另一個方法就是通過重新賦值的方式進行,例如可以寫一個變數方法:
Java代碼
- public static int[] swap(int a1, int a2){
- int tmp = a1;
- a1 = a2;
- a2 = tmp;
- return new int[]{a1,a2};
- }
根據傳遞進來時的順序,最後再重新取回對應的值,例如:
Java代碼
- int a = 4;
- int b = 5;
-
- int[] swap = swap(a, b);
- a = swap[0];
- b = swap[1];
- System.out.println(a+" "+b);
看來沒有指標或引用,也是有很大問題,按理,以下方法應該適用於所有的交換:
Java代碼
- public static <T> void swap(T t1, T t2){
- T tmp = t1;
- t1 = t2;
- t2 = tmp;
- }
不過,測試過後就會發現,這個方法總是失效的。所以我們總是必須想到其他的方式來實現。