String valueOf против конкатенации с пустой строкой
Я работаю над оптимизацией кода Java. Я не понимаю разницу между String.valueOf
или знаком +""
:
int intVar = 1; String strVar = intVar + ""; String strVar = String.valueOf(intVar);
В чем разница между строками 2 и 3?
- SDK Manager.exe не работает
- Попытка чтения с консоли в Java
- Поиск в Android с помощью fragmentов
- Выполнение не выполнено для задачи ': app: dexDebug'. com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException
- Быстрое размытие растровых изображений для Android SDK
- Завершение программы Java
- Android: в таблице нет столбца с именем «имя переменной» Ошибка базы данных MySql
- Dx bad class file magic (cafebabe) или версия (0033.0000) с ADK14
- Приемник как внутренний class в Android
- ИК-излучатель и Android 5.0
- Как перемешать символы в строке
- Вызов метода подclassа в Java
- Событие масштабирования для карт google на Android
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 более эффективно.