现在的位置: 首页 > 综合 > 正文

那些,java编程路上犯的低级错误(一)

2018年04月03日 ⁄ 综合 ⁄ 共 1499字 ⁄ 字号 评论关闭

2012年12月22日

===============================

今早醒来,发现居然还在床上,居然还在寝室,居然还在学校。委屈 很想竖起中指,对天说句:说好的世界末日呢?!

 

言归正传,今天闲来无事,于是决定那一些java基础代码练练打字暖暖手。

于是就有了下面的问题:

 

(一)关于java中交换—swap方法的编写

常看到一些刚学C语言的猿们,写一个名之exchange的交换两个数的函数。代码如下:

  1. void exchange(int *a, int *b)  
  2. {  
  3.     int temp = 0;  
  4.     temp = *a;  
  5.     *b = *a;  
  6.     *a = temp;  

上面是一般的简历临时中间存储变量的方法。

当然,内力比较深厚的程序员都会使用多种方法写出这个效果。以下列举2种其他的方法:

 

1,去除中间存储变量

  1. void exchange(int *a, int *b)  
  2. {  
  3.     *a = *a + *b;  
  4.     *b = *a - *b;  
  5.     *a = *a - *b;  
  6. }

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深一层一些思考。

抱歉!评论已关闭.