JAVA中String類以形參傳遞到函數裏面,修改後外面引用不能獲取到更改後的值

最近熟悉java類時,瞭解到String類是引入類型,同時是一個不可變字符序列java

public static void main(String[] args){
     String str="hello"; 
     System.out.println(str);
     change(str); 
     System.out.println(str);
}
 private static void change(String str) {
     str=str+"world";
}複製代碼

獲得結果仍是hello面試

String類的存儲是經過final修飾的char[]數組來存放結果的。不可更改。因此每次當外部一個String類型的引用傳遞到方法內部時候,只是把外部String類型變量的引用傳遞給了方法參數變量。對的。外部String變量和方法參數變量都是實際char[]數組的引用而已。因此當咱們在方法內部改變這個參數的引用時候,由於char[]數組不可改變,因此每次新建變量都是新建一個新的String實例。很顯然外部String類型變量沒有指向新的String實例。因此也就不會獲取到新的更改。
程序例子假定str指向A內存空間,A內存空間存放了」hello」這個字符串,而後調用change函數將str引用賦值給了str引用,注意是引用。確實是傳址,咱們知道String是不可變的,任何進行更改的操做都會產生新的String實例。因此在方法裏面str指向了堆空間0x44,可是這個時候str仍是指向0x01空間,並無指向0x44。數組


兩次輸出結果都是bash


讓我想起了js中的面試題函數

var arr=[1,2,3];spa

var arr1=arr;code

arr1=[];cdn

輸出arr仍是[1,2,3];blog

相關文章
相關標籤/搜索