最近熟悉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