什麼是Java中的strcpy?什麼是Java中的strcpy?
String s1, s2;
s1 = new String("hello");
s2 = s1; // This only copies s1 to s2.
什麼是Java中的strcpy?什麼是Java中的strcpy?
String s1, s2;
s1 = new String("hello");
s2 = s1; // This only copies s1 to s2.
本聲明:中s1
s2 = s1;
值複製到s2
。該值只是一個參考,所以現在s1
和s2
指的是同一個對象。所以,如果這是一個可變類型(例如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);
然而,這很少一個好主意。
我想知道:有沒有人遇到真正需要原始副本的真實生活實例? – amit
@amit:不適用於不可變的字符串,但因爲複製可變的StringBuffer有顯而易見的理由 –
@amit:是的,我做過。當從字典文件中讀取很多*非常短的*行時,標準庫*使用*來分配一個至少有80個字符的支持數組的字符串。在執行'line = new String(line)'之間的內存使用情況差異很大。我相信事情現在好轉了。 –
沒有s2
將引用新創建的字符串對象與s1
一起。
字符串是不可改變的,所以你永遠不會需要複製它。 (除了在罕見的情況下)
例如
s1 = new String("hello");
是基本相同
s1 = "hello";
和
s2 = s1;
基本上是一樣的
s2 = "hello";
謝謝你的簡單例子。 – user1301568
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打印字符串不是相同的字符串... 但同時這樣做的對象對一個對象作出的更改會影響另一個......需要克隆對象..有沒有問題的字符串
對於任何其他的對象來說,這是不會有任何不同的,不可變的或不可變的。對s1的第二個賦值是爲引用(指針)設置一個新值,而不是修改該對象。修改對象就像's1.someField = xyz;'。 –
雅的字符串是正確的...條件像這樣Object 0 = new Object();對象o2 = o;需要克隆...這就是我所說的 – Aravind
只有當對象將來可能被修改時才需要「克隆」,並且您不希望從副本中「看到」該修改。沒有什麼關於不可變對象的「魔法」 - 他們根本沒有任何修改它們的方法。 –
String構造做這項工作很容易,因爲在Java中,字符串對象是不可改變的
String st="hello";
String st1=new String(st);
輸出將ST1的是你好
與不變性無關。這只是一個問題,你是否得到單獨的對象或對同一對象的重複引用。不變性僅僅意味着,如果您只是複製引用,那麼您保證以後的操作不會更改對象的值。 –
@ sp00m:不,那是不真實的。它複製一個參考。在這方面沒有什麼關於String的神奇功能 - 只是它是不可變的。你也可以編寫你自己的不可變類。 (如果您的評論是一個答案,我會downvoted它 - 這是不正確的,誤導性的。) –
@JonSkeet好了,知道了。 – sp00m
我的意思是s2 = s1只複製參考。我編輯過。 – user1301568