一個隨意list引發的慘案(java到底是值傳遞還是引用 傳遞?)


前兩天寫了一個遞歸,因為太年輕,把一個遞歸方法需要用到的list定義該遞歸方法外了,結果開始斷點測試的時候有點小問題 ,然后上線之后因為數據量太多導致了一個java.util.ConcurrentModificationException異常,然后就debug。然后一頓操作因為單元測試的時候馬虎出了點問題,以為新寫的方法有問題,然后又一頓操作才發現在單元測試出了問題。最后成功解決問題,提交之后領導給我說:“你這個遞歸看起來還有問題哦?”,然后我心里一涼。然后領導再問:“你這個是值傳遞還是引用傳遞啊”我心中大驚,雖然我是一個新手,但是我看了幾篇文章說java只有值傳遞的呀,但是大佬這么問我,我也不敢回答,害怕的一匹。然后偷偷查閱資料冷靜分析java值傳遞還是引用傳遞。

先總結:

java中方法參數傳遞方式是按值傳遞。
如果參數是基本類型,傳遞的是基本類型的字面量值的拷貝。
如果參數是引用類型,傳遞的是該參量所引用的對象在堆中地址值的拷貝。

因為在平常使用中,我們在傳遞一個對象之后並不會在new一次該對象,如下圖第三行所示,

 

所以方法內的對象和方法外的對象所指的內存是同一個地址(對象和list存放在堆中,方法內的數據存放在棧幀中,棧幀屬於某個方法所有,方法結束后就銷毀,而堆屬於類),如果我們在方法內修改了該對象,在外面獲取該對象也會改變,所以會被誤認為是應用傳遞。如果在操作之前new一下,方法的對象指向和傳遞過來的對象指向就不是同一個地址了,所以我們在方法里面 操作了對象,方法外的對象也不會改變。如下圖

那么問題來了,string類型是一個引用類型,然而我們操作他的時候和基礎類是一樣的,並沒有引用傳遞的那種幻覺是為什么呢?

因為string不是基礎類,它比較特殊,它是不可變類,每次我們操作它的時候就相當於new了一次。

所以大佬的意思應該是傳入之后有沒有改變該對象的指像。 我感覺如果沒有改過的話,我們可以把這次傳遞用術語稱為引用傳遞。然而還是要時刻謹記JAVA只有值傳遞,沒有引用傳遞

其實會在java值傳遞和引用傳遞上不清楚的原因是基礎不牢固。基礎不牢固有兩重一次,第一重是學的不牢固。第二重是基礎原理(不懂jvm)不牢固。所以路漫漫其修遠兮,吾將上下而求索呀。

如果想要詳情了解值傳遞,就看下面這個文章,寫的挺不錯的。

 

 

 https://blog.csdn.net/bntx2jsqfehy7/article/details/83508006


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM