为了能更多的掌握C/C++,时不时的就会拿起一本什么书看看。
昨天又看到了请指针和引用的部分,又会有经典的swap()方法的实现。几乎所有人都知道了,要实现一个正确的swap()方法需要以指针或引用为参数,例如:
//使用指针 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; }
我不太熟悉C/C++,所以要是有什么问题,表怪我。
突然就想到,在Java中需要怎么实现这个过程呢?Java中没有所谓的指针和引用的概念,并且Java中所有的传递都是值传递,也就是说,下面的方法在Java中同样没有效:
void swap(int a, int b){
int tmp = a;
a = b;
b = tmp;
}
所以这是相当尴尬的事。为了实现一个正确的交换过程,好像必须做一些更复杂的事。
如果a,b是类中两个成员变量,那可以直接写如下方法:
int a = 4;
int b = 5;
public void swap(){
int tmp = a;
a = b;
b = tmp;
}
因为Java中所有的方法、变量必须在一个类中声明,所以此时a,b和swap()在同一个类中,因此不需要传递参数,在swap()方法中就直接引用对象的成员变量。
另一个方法就是通过重新赋值的方式进行,例如可以写一个变量方法:
public static int[] swap(int a1, int a2){
int tmp = a1;
a1 = a2;
a2 = tmp;
return new int[]{a1,a2};
}
根据传递进来时的顺序,最后再重新取回对应的值,例如:
int a = 4;
int b = 5;
int[] swap = swap(a, b);
a = swap[0];
b = swap[1];
System.out.println(a+" "+b);
看来没有指针或引用,也是有很大问题,按理,以下方法应该适用于所有的交换:
public static <T> void swap(T t1, T t2){
T tmp = t1;
t1 = t2;
t2 = tmp;
}
不过,测试过后就会发现,这个方法总是失效的。所以我们总是必须想到其他的方式来实现。