2012-04-24 70 views
3

在零開始我想用以下緊湊的方式建立一個String緊湊的方式來建立一個字符串使用+ =

String attributes = null; 
for (Map.Entry<String, String> kvp : attrs.entrySet()) 
    attributes += (kvp.getKey() + "='" + kvp.getValue() +"' "); 

但結果是一個String內容如下:nullattr1='val1' attr2='val2' attr3='val3'。我認爲這是由於在當前值爲空的String上執行+=操作而發生的。有沒有簡潔的方式來做到這一點,而不必檢查每次通過循環時attributes是否爲空?

回答

4

這樣做對在代碼的開始初始化String

String attributes = ""; 
2

String attributes = ""; 
for (Map.Entry kvp : attrs.entrySet()) 
    attributes += (kvp.getKey() + "='" + kvp.getValue() +"' "); 
0

初始化attributes爲:

String attributes = ""; 

編輯

+3

完全沒有必要。你認爲'valueOf'會爲一口井做什麼? – Voo 2012-04-24 22:07:07

+0

如果您使用valueOf而不是顯式創建新的String對象,則類String可以重用對象。我個人是這樣做的,並且和它一起堆疊 - 不管是完全是想法還是必要的,它都是設計選擇的問題,並且喜歡這樣做。 – Bitmap 2012-04-24 22:14:06

+0

常量字符串值已經實現 - 實際上它是JLS所要求的。因此,只有*一個*字符串'「」'並且使用valueOf不會改變這個事實。只要你不使用字符串構造函數,它不會有任何負面影響,但它仍然是完全不必要的:) – Voo 2012-04-24 22:26:57

3

null不是一個空字符串

您應該""而不是null開始:

String attributes = ""; 
... 

如果'...'是沒有必要的,最緊湊的方式是做

String attributes = ""; 
for (Map.Entry<String, String> kvp : attrs.entrySet()) 
    attributes += kvp + " "; 

如果你有很多的價值觀,它是還建議使用StringBuilder而不是僅用String

StringBuilder attributes = new StringBuilder(); 
for (Map.Entry<String, String> kvp : attrs.entrySet()) 
    attributes.append(kvp.getKey()) 
       .append("='") 
       .append(kvp.getValue()) 
       .append("' "); 
1

與其說String attributes = null;的,只是說String attributes = "";

如果你將要加入大量的字符串,你可能想看看StringBuilder的,因爲在內部避免了每次添加新的東西的時候重新分配內存結束,哪個+ =做。

+2

這是Java,而不是C++。你的意思是StringBuilder。 – jacobm 2012-04-24 22:06:09

+0

謝謝你,我的腦海裏一定是漏掉了這個問題中的哪一部分。 – Datalore 2012-04-25 01:07:50

7
String attributes = ""; 

會允許這樣做,並適用於5或20值的小地圖。對於較大的地圖,StringBuilder的或〜緩衝區是要走的路:

StringBuffer sb = new StringBuffer (estimatedSize); 
for (X x: xx) 
    sb.append (foo).append (bar).append (baz); 
String attributes = sb.toString(); 
1

其他人是對的,你可以設置你的String爲空字符串的開始,但如果你從很多建築的字符串的數據,可能需要使用專爲字符串構建而設計的StringBuilder對象。

public String getString(Map<String, String> attrs) { 
    StringBuilder bldr = new StringBuilder(); 
    for (Map.Entry<String, String> kvp : attrs.entrySet()) { 
     bldr.append(String.format("'%s'='%s' ", kvp.getKey(), kvp.getValue())); 
    } 
    return bldr.toString(); 
} 
相關問題