2010-04-16 2 views
2

У меня есть код для конкатенации строк. Однако по какой-то причине конечная строка не является комбинацией требуемых строк. Рассмотрим следующий код:Помощь в отладке кода конкатенации строк

//cusEmail is of type String[] 
String toList = ""; 
for(i=0; i < cusEmail.length - 1; i++) { 
    toList.concat(cusEmail[i]); 
    toList.concat("; "); 
    System.out.println(cusEmail[i]); 
} 
toList.concat(cusEmail[i]); 
System.out.println(toList); 

Первый оператор sout отображает строки в cusEmail [i] правильно. Однако, после конкатенирования, второй сит отображает пустой/пустой. Любая причина для этого? Я конкатенирую его правильно?

ответ

1

String объекты неизменяемы. Вызов concat на toList не изменит значение объекта toList. Вместо этого concat вернет другой объект String, который является конкатенацией двух строк. В вашем примере вам нужно сохранить результат каждого из вызовов в concat в переменной toList.

Например,

toList = toList.concat(cusEmail[i]); 

Альтернативой с использованием метода concat было бы использовать оператор конкатенации. Это может быть немного лучше читать.

toList = toList + cusEmail[i]; 

Однако следует отметить, что каждый раз, когда одна строка объединяется на другую строку, новый объект String должен быть создан, содержащий копии информации, содержащейся в двух исходных строк. Это может быть дорогостоящим способом построения строки, когда она выполняется снова и снова в цикле, таком как то, что у вас есть. Это верно, если вы используете метод concat или оператор конкатенации. Альтернативой является использование объекта StringBuilder для создания вашей строки.

StringBuilder toList = new StringBuilder(); 
for(i=0; i < cusEmail.length - 1; i++) { 
    toList.append(cusEmail[i]); 
    toList.append("; "); 
    System.out.println(cusEmail[i]); 
} 
toList.append(cusEmail[i]); 
System.out.println(toList.toString()); 
3

Строка неизменны. Это означает, что toList.concat(..) не изменяется toList. Вместо этого он возвращает новую строку:

toList = toList.concat(..); 

Однако более целесообразно использовать StringBuilder.append(..):

StringBuilder toList = new StringBuilder(); 
for (...) { 
    sb.append(emails[i]); 
    sb.append("; "); 
} 
... 
return sb.toString(); 

Еще лучше (с точки зрения повторного использования кода) способ заключается в использовании утилита для contatenating строк с разделителями. Как ArrayUtils.join(emailsArray, "; "); (from commons-lang)

Смежные вопросы