2016-06-10 52 views
0

代碼爲什麼函數修改array [0]而不是Java中的字符串?

public class Foo { 

    public static void main(String[] args) { 

     //declaring and initializing String variable 'str' with value "outside" 
     String str = "main"; 

     //declaring and initializing Array 'array' with values 
     String [] array = {"main"}; 

     //printing values of str and array[0] 
     System.out.println("str : " + str + " , array[0] : " + array[0]); 

     //calling function foo() 
     foo(str, array); 

     //printing values after calling function foo() 
     System.out.println("str : " + str + " , array[0] : " + array[0]); 
    } 

    static void foo(String str, String[] array){ 
     str = "foo"; 
     array[0] = "foo"; 
    } 

} 

輸出

str : main , array[0] : main 
str : main , array[0] : foo 

問題

爲什麼字符串str保持同爲 「主」,但array[0]值會從「主要修改「調用函數後調用」foo「?效果不應該一樣嗎?

+1

的字符串文字不能用你的方法來改變,因爲它是按值傳遞作爲一個字符串,但數組可以作爲傳遞該陣列的價值是它的參考,所以您可以通過參考影響其內容。 – ManoDestra

+0

Java中的字符串必須是不可變的 – peter

+0

您不能修改字符串,因爲它是不可變的對象。建議您使用StringBuffer –

回答

1

沒有它應該是因爲對Java如何與引用涉及不。

你給你的方法兩個參數:一個字符串(即,一個字符串的地址)和一個數組(即,一個數組的地址)。這些地址本地存儲在strarray,如果您更改地址,方法之外的地址(strarraymain())不會更改。

然後,您創建一個字符串「富」,並將其(或更確切地說,它的地址)分配給本地str。這對main()的str沒有任何影響。但是,數組地址是本地的,但數組內部不是。所以,如果你會寫

array = {"foo"}; 

,不會影響main()array,但

array[0] = "foo"; 

你改變內部東西你給作爲參考的陣列。

1

這是因爲數組有標題指向內存中的對象。數組實際上只是其他地方的參考。所以當你修改數組時,你正在修改指向內存中一個對象的元素0。當您的方法退出時,您尚未修改數組[0]引用,因此您指向的內存中您更改了該對象的相同位置。

另一方面,當您將其賦值爲「foo」時,String實際上只是將其更改爲方法範圍,因爲您正在將指針更改爲新的字符串。您將不得不返回字符串或將其重新分配給主方法中的引用,或者可以將該字符串設置爲始終具有相同引用的字段。

這個鏈接可能會幫助我更好地解釋它。

Does Java pass by reference or pass by value?

1

在您的代碼中,您通過str作爲foo的參數。在java中,當你傳遞任何變量作爲參數時,它就變成了新東西。在foo方法中更改str只會更改str而不是mainstr

但是,對於array,兩個變量都從相同的數據中獲取。這是因爲數組是對象。當一個對象按值傳遞時,它創建一個副本,但被複制的對象仍然引用相同的數據。

這是更好地解釋在這裏:Java pass by reference or by value

相關問題