дата = дата + часть против date.concat (часть) - PullRequest
1 голос
/ 15 января 2010

У меня есть небольшая Java-программа, которую я разрабатываю для проекта, которая извлекает почтовый ящик пользователя из указанного URI с помощью JavaMail, а затем начинает обработку сообщений.

В Outlook в меню свойств есть функция для установки даты окончания срока действия сообщения, которая добавляет (например):

Дата истечения: четверг, 14 января 2010 г., 17:00:00 -0000

К заголовку сообщения.

Извлечь это из заголовка электронной почты просто, используя метод getHeader (заголовок String) из javax.mail.Message, и он возвращает 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)?

ТИА

JimiF

1 Ответ

3 голосов
/ 15 января 2010

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