1. 程式人生 > >java 引用傳遞和值傳遞

java 引用傳遞和值傳遞

方式 con 並不是 一個 基本類型 依賴 tro 結束 事務

1.為什麽要分值傳遞和引用傳遞:

  基本類型存在在棧中,復合類型(對象)存在堆中。操作棧的速度要快於堆,且對象的復制相比基本類型不僅浪費內存而且速度比較慢。

從這裏就可以看出來:對象是按照引用傳遞(數據庫事務封裝Connection對象傳遞的時候最能體現這點);基本類型是按照值傳遞。

2.那為什麽String類型傳遞後會表現的值傳遞的特性:這並不是由於值傳遞而導致的,而是由於String類的不可變性(只讀特性)導致的。String類型按照引用傳遞,但是一旦改變了,就變成新的對象了,原來引用指向的對象還是不變的。String的不可變性可以通過源碼看出來,value由final修飾,同樣的基本類型的封裝類型Integer,Double等同樣是不可變的。

3.字符串直接賦值和用new出的對象賦值的區別僅僅在於存儲方式不同。傳遞的方式都是按照引用傳遞(java 編程思想也是這麽解釋的)

4.重載(一個操作符,在應用於特定的類時,會被賦予特殊的含義)的操作符+會用StringBuilder優化,比如:String s = "a"+"ab"+"cc";其實就一個StringBuilder調用append方法,將結果賦值給s。但是這並不意味這可以濫用+號來連接字符串。從上面的例子可以看出一次拼接(;號結束,把結果賦值給一個變量)就創建一個StringBuilder對象。所以+號連接只能用在簡單的連接時,如果連接發生在循環中,就意味著隨著循環的進行會創建大量StringBuilder對象,來完成最後的結果,而創建對象是一個十分耗時的操作,這樣就會花長時間執行拼接,降低程序效率,所以這種時候,我們就要通過在循壞前顯示的創建StringBuilder對象在循環中顯示調用append對象來拼接字符串,不再依賴編譯器的優化

5.String s1 = "aa" , String s2 = "aa" 這個時候s1==s2是正確的,“aa”存放在常量池中,是同一個。但是String s1 = new String(“aa”),String s2 = new String(“aa”)此時s1==s2 是false的 ,是在堆中的不同對象。也就是這倆種獲得字符串的方式是不一樣的。

java 引用傳遞和值傳遞