#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 "";
в основном используется побочный эффект для архивирования его назначения, что может затруднить понимание для начинающих.