String valueOf против конкатенации с пустой строкой - программирование
Подтвердить что ты не робот

String valueOf против конкатенации с пустой строкой

Я работаю в оптимизации кода Java. Я не понимаю разницу между знаком String.valueOf или +"":

int intVar = 1;
String strVar = intVar + "";
String strVar = String.valueOf(intVar);

В чем разница между строками 2 и 3?

4b9b3361

Ответ 1

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

Ответ 2

Задайте себе цель кода. Это:

  • Конкатенировать пустую строку со значением
  • Преобразование значения в строку

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

Обратите внимание, что это работает для всех типов и будет возвращать "null" при передаче нулевой ссылки вместо того, чтобы бросать NullPointerException. Если вы используете класс (а не int, как в этом примере), и вы хотите, чтобы он выдавал исключение, если оно было нулевым (например, потому что оно представляет ошибку), вызовите toString вместо ссылки.

Ответ 3

Использование String.valueOf(int), или лучше, Integer.toString(int) относительно более эффективно для машины. Однако, если производительность не является критичной (в этом случае я бы не предложил использовать ее). Тогда ""+ x намного эффективнее использует ваше время. ИМХО, это обычно более важно. Иногда массово более важно.

Другими словами, ""+ уничтожает объект, но Integer.toString() создает несколько в любом случае. Либо ваше время более важно, либо вы хотите избежать создания объектов любой ценой. Вы вряд ли будете в том положении, что создание нескольких объектов прекрасное, но создание еще одного не является.

Ответ 4

Я бы предпочел valueOf(), потому что я считаю его более читабельным и явным.

Любые проблемы с производительностью - это микрооптимизации, которые не поддаются измерению. Я бы не стал беспокоиться о них, пока не смог бы измерить и увидеть, что они сделали разницу.

Ответ 5

Первая строка эквивалентна

String strVal = String.valueOf(intVar) + "";

чтобы была сделана некоторая дополнительная (и бессмысленная) работа. Не уверен, что компилятор оптимизирует конкатенации с пустыми строковыми литералами. Если это не так (и, глядя на ответ @Jigar, это, по-видимому, нет), это, в свою очередь, станет

String strVal = new StringBuilder().append(String.valueOf(intVar))
                      .append("").toString();

Итак, вы действительно должны использовать String.valueOf напрямую.

Ответ 6

Конкатенация строк и других переменных на самом деле использует String.valueOf()StringBuilder) снизу, поэтому компилятор, мы надеемся, отбросит пустую строку и выдаст одинаковые байткоды в обоих случаях.

Ответ 7

С точки зрения оптимизации я всегда предпочитаю String.valueOf() между ними. Первый - это просто взломать, пытаясь обмануть преобразование intVar в String, потому что оператор +.

Ответ 8

String strVar1 = intVar+"";
String strVar2 = String.valueOf(intVar);

strVar1 равнозначен strVar2, но с использованием int + emptyString "" это не элегантный способ сделать это.

с использованием valueOf более эффективно.