2017-07-11 122 views
3

此代碼的目標是將字符串「A Happy」更改爲「Hippy」。使用字符數組打印字符串而不是創建新的字符串對象

String originalStr = "A Happy"; 
char[] charOriStr = originalStr.toCharArray(); 
charOriStr[3] = 'i'; //simplified code, we are supposed to loop through the String 

要打印修訂字符串,我用:

System.out.println(charOriStr); 

但是推薦解如下:

String revised = new String(charOriStr); 
System.out.println(revised); 

我是一個初學者,我不知道,如果我應該按照推薦的解決方案作爲最佳實踐指南?在此欣賞一些指導,謝謝。

+0

爲什麼不使用'String'中的'replaceAll'方法? – Jobin

+0

'for(char ch:charOriStr)System.out.print(ch); System.out.println();' –

+2

在你的第一個代碼片段中,'revised'沒有被定義。如果你直接通過'System.out.println(修改)'來關注它,'你會看到一個錯誤,說'修改'是未知的 – Aaron

回答

3

這麼推薦的人顯然是錯的。既然你已經有了char數組,你不需要再次將它轉換爲String,只需要打印即可。因爲您正在使用的println方法將再次將您的字符串轉換爲內部的char數組。

+0

抱歉,我不清楚你最後的陳述。您能否詳細說明'您正在使用的println方法會再次將您的字符串轉換爲內部的char數組。'? – yogescicak

+1

@yogescicak我的意思是,如果您再次查看println方法的內部實現,它會在打印到控制檯之前將char []轉換爲字符串 –

2

您可以使用StringBufferStringBuilder並編輯相同的輸入,而不是創建一個新的。

public class HelloWorld 
{ 
    public static void main(String[] args) 
    { 
     StringBuilder str = new StringBuilder("A Happy"); 
     str.setCharAt(3,'i'); 
     System.out.println(str); 
    } 
} 

底線 - 退房StringBuilder,有很多很酷的東西,你可以用它做。

2

A char[]是Java 8以前的實現。對於可以爲世界上所有腳本保存Unicode文本的字符串,包括拉丁文,阿拉伯文,希臘文,西里爾文等。

保持字符串的抽象層次更多... 抽象,當然完全完成。 如果你想在汽車中替換一個線圈,你不希望收到它作爲一個部件的集合。

例如char是UTF-16編碼的一個2字節值,Unicode的一種形式。現在的int值,所謂的碼點有較少的不規則性。所以你可以基於代碼點來制定解決方案,並且也可以處理中文。

+0

對不起,但我不明白這裏的邏輯。無論如何,String的內部會形成一個char數組。所以在字符串內部會遇到同樣的問題。不是嗎?糾正我,如果我錯了。 –

+0

@SureshAtta String的方法適當地處理UTF-16代理。逐個打印字符與將整個字符串轉換爲「UTF-8」進行打印效果不同。 – RealSkeptic

相關問題