2012年12月22日
===============================
今早醒来,发现居然还在床上,居然还在寝室,居然还在学校。 很想竖起中指,对天说句:说好的世界末日呢?!
言归正传,今天闲来无事,于是决定那一些java基础代码练练打字暖暖手。
于是就有了下面的问题:
(一)关于java中交换—swap方法的编写
常看到一些刚学C语言的猿们,写一个名之exchange的交换两个数的函数。代码如下:
- void exchange(int *a, int *b)
- {
- int temp = 0;
- temp = *a;
- *b = *a;
- *a = temp;
- }
上面是一般的简历临时中间存储变量的方法。
当然,内力比较深厚的程序员都会使用多种方法写出这个效果。以下列举2种其他的方法:
1,去除中间存储变量
- void exchange(int *a, int *b)
- {
- *a = *a + *b;
- *b = *a - *b;
- *a = *a - *b;
- }
2,使用位运算
void exchange(int *a, int *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
看到这里,可能聪明如你也能猜测到我想说的。C语言中可以使用地址值(指针)来达到交换原内存中数据的效果。
那么JAVA中,如何处理?
往下深思,又可引出 JAVA中重要的 值传递 和 引用传递 观点问题。
曾看到一篇文章,在java中,这2个观点至今没有统一,大概有些大佬们觉得只有值传递,有些大佬们又觉得存在引用传递。(吾等小辈当然只能附和大佬们的争议)
如果是交换数组中的两个元素,当然我可以快速的告诉你一个办法。
public void exchange(int[] num,int i,int j) {
int temp = num[i] ;
num[i] = num[j] ;
num[j] = temp ;
}
这是采用了传数组的引用(首地址)来达到实际交换效果。如果只是两个独立的数,貌似要用方法来进行交换 就有一点问题。
下面列举出其中一种解决方法:
class WrappedNumber<T extends Number> {
private T i = null;
public WrappedNumber(T i) {
this.i = i;
}
public T getNumber() {
return i;
}
public void setNumber(T i) {
this.i = i;
}
}
//测试实例 如下
public class Hello {
public static <T extends Number> void swap(WrappedNumber<T> a, WrappedNumber<T> b) {
T temp1 = a.getNumber();
a.setNumber(b.getNumber());
b.setNumber(temp1);
}
public static void main(String[] args) {
WrappedNumber<Short> a = new WrappedNumber<Short>((short)10);
WrappedNumber<Short> b = new WrappedNumber<Short>((short)20);
Hello.<Short>swap(a, b);
System.out.println("The answer is: a=" + a.getNumber() + ", b="+b.getNumber());
}
}
以上方法,效果虽然达到,但是操作有点繁琐。希望路过的大侠们给指点一二,也给初学JAVA的程序猿们对JAVA深一层一些思考。