2012-05-10 28 views
1

一個字符串的內容到一個新的String在Java中有了這個方法分配從參數

void doSomething(String input) 
{ 
    //trick for create new object instead of reference assignment 
    String workStr= "" + input; 

    //work with workStr 
} 

這是這樣做Java的方式?

編輯

  • 如果使用輸入變量作爲輸入=東西然後Netbeans的警告即將方法參數
  • 如果我和新的字符串(輸入)創建它分配一個值 它發出警告使用String構造

也許解決方案是不無輸入分配,或者只是忽略警告..

+5

爲什麼你想要一個對象的副本? –

+1

正在做什麼工作?您無法將'input'更改爲'String'實例是不可變的。當你首先需要修改版本的'input'時,只需將它保存到'workStr'。 – hmjd

+0

對於Oli的評論+1我可以認爲沒有必要明確創建一個新的String。你幾乎肯定沒有獲得你期望的好處。 –

回答

5
String copy = new String(original); 

初始化一個新創建的String對象,以便它表示與該參數相同的字符序列;換句話說,新創建的字符串是參數字符串的副本。除非需要顯式拷貝原始文件,否則不需要使用此構造函數,因爲字符串是不可變的。

在Java http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#String(java.lang.String

+0

這是第一次嘗試,但Netbeans警告「字符串構造函數調用」,如果我讓Netbeans做自動重構它分配引用,我認爲這是一個錯誤? –

+1

我想製作一個字符串的副本並不常見,這就是爲什麼Netbeans警告你。 –

+0

@Hernán - Netbeans基本上是正確的,沒有理由複製,並且分配引用將以較少的內存使用量實現相同的功能。你能舉一個例子說明你爲什麼認爲它是一個錯誤,即一些代碼行爲不同嗎? –

3

String s爲不可變的,這意味着不能改變對象本身(返回一個字符串(例如子的任何操作)將返回一個新的)。

這意味着沒有必要爲String創建新對象,因爲您無法修改原始對象。任何企圖這樣做只會導致內存浪費

當所討論的對象是可變的時,賦值引用只是一個問題,因爲一個對象的更改將反映在同一引用的所有其他副本中。