Разница между Long.toString(i) и i «»

#java #string

#java #строка

Вопрос:

мы часто сталкиваемся со сценарием, в котором нам нужно передать строковое представление примитива, и чаще всего мы не используем

   WrapperClass.toString() ;
  

и иногда мы обычно пишем

   i   "";
  

если мы проверяем реализацию toString любого класса-оболочки, он создает новый объект String каждый раз, когда мы его вызываем. и то же самое верно и для примитива «» (поскольку конкатенация во время выполнения создаст новый строковый объект)

Итак, есть ли какая-то разница между ними, или это просто альтернативные способы преобразования примитива в строковый объект;

Ответ №1:

Лично мне нравится String.valueOf(i) :

  • Вы можете использовать его со всеми типами (даже не примитивными)
  • Это безопасно для null (при условии, что вы довольны строковым значением «null» при преобразовании значения null)
  • Это выражает ваше намерение намного лучше, чем "" i — этот код выражает конкатенацию строк, а это совсем не то, что вам нужно.

Ответ №2:

Благие намерения.

При написании i ""; вы, возможно, оставляете будущему сопровождающему вашего кода (которым вполне можете быть вы) выяснить, каким будет этот результат.

WrapperClass.toString(); является более явным и, хотя и более подробным, его намерения более ясны. Кроме того, слабая типизация — это не то, что вы обычно видите в Java, поэтому я предлагаю вам придерживаться написания идиоматического кода Java.

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

Итак, в конце концов, это вопрос стиля, хотя я бы предложил использовать более подробную версию вашего кода.

Комментарии:

1. разве нет разницы в производительности? как будто вы смотрите на реализацию WrapperClass.toString(), он выполняет большую обработку, а именно (создает символ [] и перебирает его), где, как я думаю, примитив «» делает new String () за кулисами?

2. @Dhirendra: Маловероятно, что это станет вашим узким местом в производительности. Если это узкое место в производительности, оно, вероятно, будет узким местом, используемым в одной конкретной функции (определяемой профилировщиком), которую вы можете настроить по мере необходимости, с подробным описанием документации, объясняющим, почему.

Ответ №3:

Функционально они одинаковы. Разница в том, что i ""; в основном используется побочный эффект для архивирования его назначения, что может затруднить понимание для начинающих.