2010-01-15 120 views
1

我有一個小型的Java程序,我正在開發一個項目,它使用JavaMail將用戶的收件箱從指定的URI中提取出來,然後開始處理消息。date = date + part vs. date.concat(part)

在Outlook,有一個在屬性菜單以設置消息,它增加了(例如)的到期日的函數:

到期日:星期四,2010年1月14日17時00分00秒-0000

到郵件頭。

使用javax.mail.Message中的getHeader(String header)方法從電子郵件頭中檢索它很簡單,它返回一個String [],其中恰好是冒號後面的部分,由空格標記。

我想要做的就是把這個String []放到一個String中,以便以後做成Date。因此,建立一個簡單的foreach循環如下:

String date = ""; 
for(String part : header){ 
    date.concat(part); 
} 
System.out.println(date); 

現在,出於某種原因,該代碼返回一個空字符串,不完全知道爲什麼,因爲這應該是有效的Java。

但是,下面的代碼做的工作,我不知道爲什麼,因爲它似乎不合邏輯我

String date = ""; 
for(String part : header){ 
    date = date + part; 
} 
System.out.println(date); 

打印出正確的日期。有人能告訴我這是否是正確的做法,如果不是,concat(String append)方法有什麼問題?

TIA,

JimiF

回答

3

String是不可變的。它的內部永遠不會從外部改變(拋開思考)。根據API文檔,String#concat()返回一個新的String包含concatenatred部分,但你忽略它。你需要得到它的手柄,並繼續在循環使用它:

String date = ""; 
for(String part : header){ 
    date = date.concat(part); 
} 
System.out.println(date); 

這就是說,你的第二個例子,也可以簡化爲:

String date = ""; 
for(String part : header){ 
    date += part; 
} 
System.out.println(date); 

這反過來說,在現實世界你想使用這個StringBuilder節省內存,因爲在循環中構建新的String如果你這樣做往往是不便宜:

StringBuilder date = new StringBuilder(); 
for(String part : header){ 
    date.append(part); 
} 
System.out.println(date.toString()); 
+0

+1耶爲'StringBuilder'!如果調用'PrintWriter'方法,則不需要調用'toString';它爲你處理。 :-) – 2010-01-15 01:06:42

+0

Doh ....現在我覺得自己像一個白癡....我現在可以看到我做錯了什麼。謝謝您的幫助! – JimiF 2010-01-15 01:08:39