2012-08-29 149 views
7

什麼是Java中的strcpy?什麼是Java中的strcpy?

String s1, s2; 

s1 = new String("hello"); 
s2 = s1; // This only copies s1 to s2. 
+3

@ sp00m:不,那是不真實的。它複製一個參考。在這方面沒有什麼關於String的神奇功能 - 只是它是不可變的。你也可以編寫你自己的不可變類。 (如果您的評論是一個答案,我會downvoted它 - 這是不正確的,誤導性的。) –

+0

@JonSkeet好了,知道了。 – sp00m

+0

我的意思是s2 = s1只複製參考。我編輯過。 – user1301568

回答

13

本聲明:中s1

s2 = s1; 

值複製到s2。該值只是一個參考,所以現在s1s2指的是同一個對象。所以,如果這是一個可變類型(例如StringBuilder,或ArrayList),那麼你是對的去關注。

然而,String是不可改變的。您不能修改對象來更改其文本數據,因此只需複製引用就足夠了。改變s2值是指不同的字符串(或使其成爲null參考)將變化s1值:

String s1 = "hello"; 
String s2 = s1; 
s1 = "Something else"; 
System.out.println(s2); // Prints hello 

如果你真的要創建一個新的String對象,可以利用你已經構造(不必要的)使用s1

s2 = new String(s1); 

然而,這很少一個好主意。

+0

我想知道:有沒有人遇到真正需要原始副本的真實生活實例? – amit

+0

@amit:不適用於不可變的字符串,但因爲複製可變的StringBuffer有顯而易見的理由 –

+3

@amit:是的,我做過。當從字典文件中讀取很多*非常短的*行時,標準庫*使用*來分配一個至少有80個字符的支持數組的字符串。在執行'line = new String(line)'之間的內存使用情況差異很大。我相信事情現在好轉了。 –

0

沒有s2將引用新創建的字符串對象與s1一起。

4

字符串是不可改變的,所以你永遠不會需要複製它。 (除了在罕見的情況下)

例如

s1 = new String("hello"); 

是基本相同

s1 = "hello"; 

s2 = s1; 

基本上是一樣的

s2 = "hello"; 
+1

謝謝你的簡單例子。 – user1301568

0
   String s1, s2; 

    s1 = new String("hello"); 
    s2 = s1; // This only copies s1 to s2. Am I right? 

    s1="adsfsdaf"; 
    System.out.println(s2); 
    System.out.println(s1); 

你是正確的s1和s2打印字符串不是相同的字符串... 但同時這樣做的對象對一個對象作出的更改會影響另一個......需要克隆對象..有沒有問題的字符串

+0

對於任何其他的對象來說,這是不會有任何不同的,不可變的或不可變的。對s1的第二個賦值是爲引用(指針)設置一個新值,而不是修改該對象。修改對象就像's1.someField = xyz;'。 –

+0

雅的字符串是正確的...條件像這樣Object 0 = new Object();對象o2 = o;需要克隆...這就是我所說的 – Aravind

+0

只有當對象將來可能被修改時才需要「克隆」,並且您不希望從副本中「看到」該修改。沒有什麼關於不可變對象的「魔法」 - 他們根本沒有任何修改它們的方法。 –

0

String構造做這項工作很容易,因爲在Java中,字符串對象是不可改變的

String st="hello"; 
String st1=new String(st); 

輸出將ST1的是你好

+1

與不變性無關。這只是一個問題,你是否得到單獨的對象或對同一對象的重複引用。不變性僅僅意味着,如果您只是複製引用,那麼您保證以後的操作不會更改對象的值。 –