date = date + part vs. date.concat(part)

时间:2010-01-15 00:44:42

标签: java concatenation javamail

我正在为一个项目开发一个小型Java程序,它使用JavaMail从指定的URI中提取用户的收件箱,然后开始处理这些消息。

在Outlook中,属性菜单中有一个功能可以设置消息的到期日期,这会添加(例如):

到期日:2010年1月14日星期四17:00:00 -0000

到邮件标题。

使用javax.mail.Message中的getHeader(String header)方法从电子邮件头中检索它很简单,它返回一个String [],其中恰好是冒号之后的部分,由空格标记。 / p>

我想要做的是将此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

1 个答案:

答案 0 :(得分:3)

String是不可变的。它的内部结构永远不会从外部改变(抛开反射)。根据API文档,String#concat() 返回包含连接部分的新String,但您忽略了它。您需要掌握它并继续在循环中使用它:

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());