<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-16  評論-50  文章-2  trackbacks-0

    在程序開發的過程,要交換兩個變量的內容,是一種比較常見的事情。在排序算法中,就有一種就叫做“交換排序法”。在所有的排序算法,交換要排序的集合中的兩個元素,幾乎是必須的過程。在Java中交換兩個元素的內容,如果你是程序員新手,你可能碰到意想不到的問題。

    首先,來看看交換下面的程序。為了交換兩個整數變量的內容,寫了下面這樣的一個方法實現:

    public void swap(int i, int j) {
        int t = i;
        i = j;
        j = t;
    }

    調用上面的方法,有問題嗎?

    int x = 100;
    int y = 1;
    swap(x, y);

    在程序執行此段代碼后,你會發現,x還是100, y還是1。為什么呢?因為Java對方法參數的傳遞,是使用值調用(call by value)的。想想,如果我這樣調用swap函數呢,swap(3, 4),這是莫名其妙的,有誰會要交換3和4這兩個常數呢。

    那沒辦法交換兩個整數變量了嗎?可以。把swap函數體替換掉swap函數的調用就可以了。如:

    int x = 100;
    int y = 1;
    int t = x;
    x = y;
    y = t;

    Java中其他的原生類型(primitive type)的情況,和int的一樣。

     

    繼續討論函數調用吧。函數調用時,參數傳遞的方式主要有兩種:

    • 值傳遞
    • 引用傳遞

    Java使用的是值傳遞。值傳遞是把變量的值、常數或常量傳遞給參數。而引用傳遞,是把變量的所在內存中的地址傳遞給參數,參數通過地址找到變量的值。很明顯,引用傳遞不能把常數傳遞給參數。值傳遞和引用傳遞還有一個很大的不同:對于像int這樣的小類型變量來說,值傳遞沒副作用,而引用傳遞有。也就是說,在函數調用的執行過程中,不能改變傳遞給參數的變量的值。

    但對于普通類類型參數的傳遞方式的理解和原生類型有點不同。對于方法method(Object o)的調用method(x), 不是把對象x復制一份傳遞給參數o,而是把對象x的在內存中的首地址,也就是把對象x的引用拷貝給參數o。這樣就能這樣實現對象的交換函數了嗎?

    public void swap(Object o, Object p) {
        Object t = o;
        o = p;
        p = t;
    }

    答案是:No。因為像下面這樣的調用:

    Object x = X;
    Object y = Y;
    swap(x, y);

    在執行完上的代碼后,x指向的還是原來的X對象,y指向的還是那個Y對象。就像歌唱的那樣:星星還是那個星星,月亮還是那個月亮。

     

    難道就不能通過方法調用實現交換這個功能嗎?可以。有兩種辦法:

    • 可以交換數組等集合里的元素
    • 用反射實現

    public void swap(Object[] a, int i, int j) {
        Object t = a[i] ;
        a[i] = a[j];
        a[j] = a[i];
    }

    用反射實現swap函數,有點殺雞用大炮的感覺。性能不怎么樣,還容易出錯。這個留著做家庭作業吧。

    posted on 2008-01-03 10:42 Jeff Lau 閱讀(1147) 評論(1)  編輯  收藏 所屬分類: Jeff On Java 2008

    評論:
    # re: 交換[未登錄] 2008-04-02 19:58 | Tom
    最后的swap(Object[] a, int i, int j)中第三個語句寫錯了吧?
    應該是a[j] = t;  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲成a∨人片在无码2023| 亚洲综合激情另类小说区| 国产成人精品久久亚洲高清不卡| 好吊妞788免费视频播放| 99在线免费观看视频| 久久精品国产亚洲沈樵| 日本免费一区二区三区| 亚洲美女一区二区三区| 久久久久久精品成人免费图片| 亚洲依依成人精品| 韩日电影在线播放免费版| 国产乱码免费卡1卡二卡3卡| 香蕉大伊亚洲人在线观看| 好大好深好猛好爽视频免费| 亚洲hairy多毛pics大全| 亚洲av成人一区二区三区在线观看 | 97在线视频免费播放| 亚洲国产精品成人一区| 久久久精品国产亚洲成人满18免费网站 | 亚洲一卡2卡3卡4卡5卡6卡| 国产成人免费片在线视频观看| 国产午夜亚洲精品不卡| 中文字幕亚洲第一| 亚洲免费在线观看视频| 色偷偷噜噜噜亚洲男人| 中文字幕无码精品亚洲资源网| 久久国产色AV免费观看| 亚洲人成电影网站久久| 亚洲一级黄色视频| 37pao成人国产永久免费视频| 亚洲精品无码永久在线观看男男| 亚洲AV无码乱码在线观看| 日韩免费在线视频| 亚洲中文字幕乱码AV波多JI| 亚洲成a人一区二区三区| 小草在线看片免费人成视久网| 亚洲色大成网站www久久九| 亚洲精品成人无限看| 成年轻人网站色免费看| 中文字幕无线码中文字幕免费| 亚洲精品日韩中文字幕久久久|