小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
很多语言中都有做值交换的API,可以直接交换两个变量的值。但Java不一样,如果按照直观的方法去写是无法交换的。
public static void swap(int a, int b){
int temp = a;
a = b;
b = temp;
}
以上,引入一个临时变量做中转的方式在很多语言中都是可行的,但是Java不行,Java的基本类型如int和String之类为值传递非引用传递,方法内部的变更只是在相互传值,不会影响到外部,以至于出了swap方法,a还是a,b还是b,可以理解为交换失败。Java对于其他对象则为引用传递。对于这样的现状为并不认为这是什么知识点,而是在设计时产生的缺陷之一,但无奈使用范围如此之广,只能换一种方式来实现了。 一种流行的方式就是用数组,因为对于数组就是引用传递了。
public static void swap(int[] data, int a, int b) {
int t = data[a];
data[a] = data[b];
data[b] = t;
}
当然,使用数组相对简单,成本也相对较低,Collections
API中的swap就是用数组实现的。如果不嫌麻烦也可以自定义对象去做。比如这样:
public void swapNum(int a, int b) {
this.b = a;
this.a = b;
}
分别将a和b定义成成员对象即可,但这就不像一个函数了,有着很强的对象属性。其实还有更简洁但比较费脑经的写法:
a = a + b;
b = a - b;
a = a - b;
唯一的风险,整型数太大时会溢出,但日常够用。