java方法中的參數(shù)傳遞機(jī)制

??今天在寫排序算法的時候,為了方便以后復(fù)習(xí)熏纯,把每一個排序算法都寫在方法里同诫。之前的交換排序、插入排序和選擇排序都沒有問題樟澜,雖然看到方法里接收值有一點(diǎn)疑惑误窖,但還是沒有仔細(xì)思考過。直到后面寫到了歸并排序秩贰,遇到坑了贩猎。

??直接上問題代碼:

public class MergeSort {

    public static void main(String[] args) {
        int a[] = {3,1,5,7,2,4,9,6};
        new MergeSort().mergeSort(a);
        for (int i = 0;i < a.length;i++) {
            System.out.print(a[i]+" ");
        }
    }

    public void merge(int [] X, int [] Y, int begin1, int begin2,int n) {
        int i = begin1;
        int j = begin2;
        int k = begin1;
        while (i < begin1 + n && j < begin2 + n && j < X.length) {
            if (X[i] < X[j]) {
                Y[k++] = X[i++];
            }else {
                Y[k++] = X[j++];
            }
        }
        while (i < begin1 + n && i < X.length) {
            Y[k++] = X[i++];
        }
        while (j < begin2 + n && j < X.length) {
            Y[k++] = X[j++];
        }
    }

    public void mergePass(int [] X, int [] Y, int n) {
        for (int i = 0;i < X.length; i = i + 2 * n) {
            merge(X, Y, i, i + n, n);
        }
    }

    public void mergeSort(int [] X) {
        int [] Y = new int[X.length];
        int n = 1;
        while (n < X.length) {
            mergePass(X, Y, n);
            n = n * 2;
            if (n < X.length) {
                mergePass(Y, X, n);
                n *= 2;
            }else {
               /* for (int i = 0;i < X.length;i++) {
                    X[i] = Y[i];
                }*/
               X = Y;
            }
        }
    }
}

最后一步X = Y ,現(xiàn)在看來確實很傻- -萍膛。
先簡單的解釋一下最后一個if-else的作用。
當(dāng)n即排序子序列長度嚷堡,小于數(shù)組X的長度時蝗罗,證明數(shù)組X還可以再一次合并到數(shù)組Y中,于是再做一次合并蝌戒。
當(dāng)n >= 數(shù)組X的長度時串塑,即表示已合并完。但是如代碼中所寫的北苟,我的合并是按 把X合并到Y(jié)中---->然后再把Y合并到X中---->把X合并到Y(jié)中·····這樣的順序進(jìn)行的桩匪。所以會有一種情況導(dǎo)致最后一次合并是把X合并到Y(jié)中,這樣數(shù)組X的值不會改變友鼻。于是我就順手加了一句else {x = y}傻昙。把數(shù)組Y的引用給數(shù)組X。
然而運(yùn)行的結(jié)果不對彩扔。


錯誤.png

仔細(xì)看妆档,可以發(fā)現(xiàn)這個結(jié)果是上一趟的歸并排序結(jié)果,那么為什么我把排序好的Y給X后虫碉,并沒有生效呢贾惦。
于是我打了兩個斷點(diǎn)找一找問題的根源。

在運(yùn)行x = y 之前:

運(yùn)行前.png

運(yùn)行前2.png

在這里可以發(fā)現(xiàn)對象X 指向的地址和 對象a指向的地址是同一個{int[8]@503}

在運(yùn)行x = y 之后:


運(yùn)行后.png

運(yùn)行后2.png

這樣可以看到,當(dāng)運(yùn)行X = Y之后须板,只是把X指向了Y碰镜,而數(shù)組a并沒有任何變化。

由此得出結(jié)論:Java 只有值傳遞參數(shù)习瑰。當(dāng)一個對象實例作為一個參數(shù)被傳遞到方法中時绪颖,參數(shù)的值就是該對象的引用一個副本。指向同一個對象,對象的內(nèi)容可以在被調(diào)用的方法中改變杰刽,但對象的引用(不是引用的副本)是永遠(yuǎn)不會改變的菠发。

??如果參數(shù)類型是原始類型,那么傳過來的就是這個參數(shù)的一個副本贺嫂,也就是這個原始參數(shù)的值滓鸠,這個跟之前所談的傳值是一樣的。如果在函數(shù)中改變了副本的值不會改變原始的值第喳。

??如果參數(shù)類型是引用類型糜俗,那么傳過來的就是這個引用參數(shù)的副本,這個副本存放的是參數(shù)的地址曲饱。如果在函數(shù)中沒有改變這個副本的地址悠抹,而是改變了地址中的值,那么在函數(shù)內(nèi)的改變會影響到傳入的參數(shù)扩淀。如果在函數(shù)中改變了副本的地址楔敌,如new一個,那么副本就指向了一個新的地址驻谆,此時傳入的參數(shù)還是指向原來的地址卵凑,所以不會改變參數(shù)的值。

于是修改代碼:

                for (int i = 0;i < X.length;i++) {
                    X[i] = Y[i];
                }

這樣就完成了該歸并排序胜臊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勺卢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子象对,更是在濱河造成了極大的恐慌黑忱,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勒魔,死亡現(xiàn)場離奇詭異甫煞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)冠绢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門危虱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唐全,你說我怎么就攤上這事埃跷∪镧瑁” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵弥雹,是天一觀的道長垃帅。 經(jīng)常有香客問我,道長剪勿,這世上最難降的妖魔是什么贸诚? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮厕吉,結(jié)果婚禮上酱固,老公的妹妹穿的比我還像新娘。我一直安慰自己头朱,他們只是感情好运悲,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著项钮,像睡著了一般班眯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烁巫,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天署隘,我揣著相機(jī)與錄音,去河邊找鬼亚隙。 笑死磁餐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阿弃。 我是一名探鬼主播崖媚,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恤浪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肴楷,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤水由,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赛蔫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砂客,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年呵恢,在試婚紗的時候發(fā)現(xiàn)自己被綠了鞠值。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡渗钉,死狀恐怖彤恶,靈堂內(nèi)的尸體忽然破棺而出钞钙,到底是詐尸還是另有隱情,我是刑警寧澤声离,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布芒炼,位于F島的核電站,受9級特大地震影響术徊,放射性物質(zhì)發(fā)生泄漏本刽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一赠涮、第九天 我趴在偏房一處隱蔽的房頂上張望子寓。 院中可真熱鬧,春花似錦笋除、人聲如沸斜友。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝙寨。三九已至,卻和暖如春嗤瞎,著一層夾襖步出監(jiān)牢的瞬間墙歪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工贝奇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虹菲,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓掉瞳,卻偏偏與公主長得像毕源,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子陕习,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理霎褐,服務(wù)發(fā)現(xiàn),斷路器该镣,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • **“當(dāng)你遇到人生重要選擇時冻璃,親戚朋友的話只能做為參考。我們的人生只能自己做決定损合,自己選擇省艳,自己負(fù)責(zé)任;沒有人有權(quán)...
    一生如燕閱讀 582評論 2 4
  • 甜美倔強(qiáng)的可愛暖嫁审, 媽媽今年又是在你生日三個星期之后才開始動手——寫這篇現(xiàn)在你還看不懂的慶生小文兒跋炕。我看上去是不是...
    嚀初閱讀 187評論 0 2
  • 看完蒂姆伯頓的新作《佩小姐的奇幻城堡》,久久走不出全片陰郁的基調(diào)律适,也走不出那如童話般穿越時空的唯美戀愛辐烂。 電影一直...
    倚書臨風(fēng)閱讀 1,622評論 0 2