1

プロジェクト用に開発している小さな Java プログラムがあります。このプログラムは、JavaMail を使用して指定された URI からユーザーの受信トレイを取得し、メッセージの処理を開始します。

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) メソッドで何が問題になっているのですか?

ティア、

ジミF

4

1 に答える 1

3

String不変です。内部が外部から変更されることはありません (リフレクションは別として)。API docs に従って、連結された部分を含むnewを返しますが、無視しています。それのハンドルを取得し、ループで使用し続ける必要があります。String#concat() String

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

とはいえ、2 番目の例は次のように短縮することもできます。

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

StringBuilderつまり、現実の世界では、メモリを節約するためにこれにa を使用したいと考えてStringいます。これを頻繁に行うと、ループ内で新しいを構築するのは安くないからです。

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