1

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

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

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

到消息头。

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

我想要做的是把这个 String[] 变成一个字符串,然后再变成一个日期。所以设置一个简单的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,

吉米夫

4

1 回答 1

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

反过来说,在现实世界中,你想使用 a StringBuilderfor this 来节省内存,因为String如果你经常这样做,在循环中构造一个 new 并不便宜:

StringBuilder date = new StringBuilder();
for(String part : header){
    date.append(part);
}
System.out.println(date.toString());
于 2010-01-15T00:58:11.607 回答