【问题标题】:date = date + part vs. date.concat(part)date = date + part 与 date.concat(part)
【发布时间】:2010-01-15 00:44:41
【问题描述】:

我正在为一个项目开发一个小型 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,

吉米夫

【问题讨论】:

    标签: java concatenation jakarta-mail


    【解决方案1】:

    String 是不可变的。它的内部结构永远不会从外部改变(撇开反射不谈)。根据 API 文档,String#concat() returns 包含连接部分的新 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());
    

    【讨论】:

    • StringBuilder+1 赞!如果调用PrintWriter 方法,则不需要调用toString;它为您处理。 :-)
    • Doh....现在我觉得自己像个白痴....我现在明白我做错了什么。感谢您的帮助!
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2021-04-09
    相关资源
    最近更新 更多