Напишем тестовый класс с двумя способами приведения числа к строки:
public class TestString {
public void intToStringConcat(int value){
String stringValue = value + "";
}
public void intToStringValueOf(int value){
String stringValue = String.valueOf(value);
}
}
Байткод для них будет следующий:
public void intToStringConcat(int);
Code:
0: new #2 // class java/lang/StringBuilder
3: dup
4: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V
7: iload_1
8: invokevirtual #4 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
11: ldc #5 // String
13: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
19: astore_2
20: return
public void intToStringValueOf(int);
Code:
0: iload_1
1: invokestatic #8 // Method java/lang/String.valueOf:(I)Ljava/lang/String;
4: astore_2
5: return
Глядя на байткод можно сделать вывод что в случае конкатенации числа со строкой создается объект StringBuilder, выполняется два раза метод append() и затем toString().
Методы StringBuilder.append(int value) и Integer.toString(int values) в конечном счете вызывают метод Integer.getChars(). Однако для Android метод Integer.toString(int values) оптимизирован, путем кэширования значений в диапазоне -100..100. Не знаю правда c какой версии эта оптимизация добавилась, но тем не менее она есть.
Из всего этого можно сделать вывод, что преобразование числа в строку методом конкатенации числа с пустой строкой является плохой практикой, особенно критичной в Android, ну и выглядит не очень красиво.
Если надо преобразовать число в строку то лучше пользоваться методом Integer.toString(int values). Если необходимо сформировать строку из нескольких слов и чисел, то конкатенация не плохой вариант, если она не выполняется в цикле. Конкатенация в цикле вообще плохая идея.