Я работаю в оптимизации кода Java. Я не понимаю разницу между знаком String.valueOf
или +""
:
int intVar = 1;
String strVar = intVar + "";
String strVar = String.valueOf(intVar);
В чем разница между строками 2 и 3?
Я работаю в оптимизации кода Java. Я не понимаю разницу между знаком String.valueOf
или +""
:
int intVar = 1;
String strVar = intVar + "";
String strVar = String.valueOf(intVar);
В чем разница между строками 2 и 3?
public void foo(){
int intVar = 5;
String strVar = intVar+"";
}
В этом подходе используется StringBuilder для создания результирующей строки
public void foo();
Code:
0: iconst_5
1: istore_1
2: new #2; //class java/lang/StringBuilder
5: dup
6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
9: iload_1
10: invokevirtual #4; //Method java/lang/StringBuilder.append:(I)Ljava/lan
g/StringBuilder;
13: ldc #5; //String
15: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/
String;)Ljava/lang/StringBuilder;
18: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/la
ng/String;
21: astore_2
22: return
public void bar(){
int intVar = 5;
String strVar = String.valueOf(intVar);
}
Этот подход вызывает просто статический метод String
для получения строковой версии int
public void bar();
Code:
0: iconst_5
1: istore_1
2: iload_1
3: invokestatic #8; //Method java/lang/String.valueOf:(I)Ljava/lang/Stri
ng;
6: astore_2
7: return
который, в свою очередь, вызывает Integer.toString()
Задайте себе цель кода. Это:
Это звучит гораздо больше, как последнее для меня... вот почему я использовал String.valueOf
. Всякий раз, когда вы можете сделать ваш код прочитанным так же, как вы бы описали то, что вы хотите достичь, это хорошо.
Обратите внимание, что это работает для всех типов и будет возвращать "null" при передаче нулевой ссылки вместо того, чтобы бросать NullPointerException
. Если вы используете класс (а не int
, как в этом примере), и вы хотите, чтобы он выдавал исключение, если оно было нулевым (например, потому что оно представляет ошибку), вызовите toString
вместо ссылки.
Использование String.valueOf(int)
, или лучше, Integer.toString(int)
относительно более эффективно для машины. Однако, если производительность не является критичной (в этом случае я бы не предложил использовать ее). Тогда ""+ x
намного эффективнее использует ваше время. ИМХО, это обычно более важно. Иногда массово более важно.
Другими словами, ""+
уничтожает объект, но Integer.toString()
создает несколько в любом случае. Либо ваше время более важно, либо вы хотите избежать создания объектов любой ценой. Вы вряд ли будете в том положении, что создание нескольких объектов прекрасное, но создание еще одного не является.
Я бы предпочел valueOf()
, потому что я считаю его более читабельным и явным.
Любые проблемы с производительностью - это микрооптимизации, которые не поддаются измерению. Я бы не стал беспокоиться о них, пока не смог бы измерить и увидеть, что они сделали разницу.
Первая строка эквивалентна
String strVal = String.valueOf(intVar) + "";
чтобы была сделана некоторая дополнительная (и бессмысленная) работа. Не уверен, что компилятор оптимизирует конкатенации с пустыми строковыми литералами. Если это не так (и, глядя на ответ @Jigar, это, по-видимому, нет), это, в свою очередь, станет
String strVal = new StringBuilder().append(String.valueOf(intVar))
.append("").toString();
Итак, вы действительно должны использовать String.valueOf напрямую.
Конкатенация строк и других переменных на самом деле использует String.valueOf()
(и StringBuilder
) снизу, поэтому компилятор, мы надеемся, отбросит пустую строку и выдаст одинаковые байткоды в обоих случаях.
С точки зрения оптимизации я всегда предпочитаю String.valueOf()
между ними. Первый - это просто взломать, пытаясь обмануть преобразование intVar
в String
, потому что оператор +.
String strVar1 = intVar+"";
String strVar2 = String.valueOf(intVar);
strVar1 равнозначен strVar2, но с использованием int + emptyString "" это не элегантный способ сделать это.
с использованием valueOf более эффективно.