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

Я работаю над оптимизацией кода 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."":()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 . Если вы используете class (а не int как в этом примере), и вы хотите, чтобы он выдавал исключение, если оно равно null (например, потому что это представляет ошибку), вместо этого вызовите toString в ссылке.

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

Другими словами, ""+ Integer.toString() объект, но 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 потому что оператор +.

Несмотря на то, что ответы здесь правильные в целом, есть один момент, который не упоминается.

"" + intVar имеет лучшую производительность по сравнению с String.valueOf() или Integer.toString() . Итак, если производительность критическая, лучше использовать пустую конкатенацию строк.

См. Этот разговор Алексея Шипилева. Или эти слайды одного и того же разговора (слайд № 24)

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

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

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

  • Преобразование UTC в текущее время локали
  • Как отключить SSLv3 в android для HttpsUrlConnection?
  • Как добавить тень и границу на круговом образе viewView?
  • Spring Boot - невозможно определить встроенный class драйвера базы данных для типа базы данных NONE
  • Https Connection Android
  • Android Intent для отправки электронной почты с приложением
  • Почему имена файлов в Java такие же, как и имя открытого classа?
  • Как динамически загружать Java-class на android / dalvik?
  • Ввод пользователем петли до тех пор, пока не будут выполнены условия
  • Android Studio не удалось найти версию, совместимую с com.android.support:appcompat-v7:+
  • В Java, почему equals () и hashCode () должны быть последовательными?
  • Давайте будем гением компьютера.