2010-01-15 85 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