Я работаю над проектом, в котором все преобразования из int
в String
выполняются следующим образом:
int i = 5;
String strI = "" + i;
Я не знаком с Java.
Это обычная практика или что-то не так, как я полагаю?
java
string
type-conversion
Денис Пальницкий
источник
источник
Integer.valueOf(i).toString()
. Должно быть, он любил предметы. В то время как это очень ясно заявляет о его намерении, это немного долго, на мой вкус.Ответы:
Нормальные пути были бы
Integer.toString(i)
илиString.valueOf(i)
.Конкатенация будет работать, но она нетрадиционна и может иметь неприятный запах, поскольку предполагает, что автор не знает о двух вышеописанных методах (что еще они могут не знать?).
Java имеет специальную поддержку оператора + при использовании со строками (см. Документацию ), который переводит опубликованный вами код в:
во время компиляции. Это немного менее эффективно (в
sb.append()
конечном итоге вызовInteger.getChars()
, чтоInteger.toString()
в любом случае было бы сделано), но это работает.Чтобы ответить на комментарий Гродригеса: ** Нет, компилятор не оптимизирует пустую строку в этом случае - смотрите:
Инициализируйте StringBuilder:
Добавьте пустую строку:
Добавьте целое число:
Извлеките последнюю строку:
Есть предложение и продолжается работа по изменению этого поведения, нацеленная на JDK 9.
источник
"" + 5
становится"5"
)."" + 5
а не просто"5"
?"" + integer
Подход используется в одном из официальных оракула учебников .Это приемлемо, но я никогда не писал ничего подобного. Я бы предпочел это:
источник
NumberFormatter
. Вы можете использовать форматы, какNumberFormat.getInstance(Locale.FRENCH)
.Это не очень хороший способ.
При выполнении преобразования из int в строку, это должно быть использовано:
источник
int i
получить коробку кInteger
перед тем , как добавляют кString strI
?StringBuilder.append(int)
(и у васStringBuilder
естьappend
метод для всех примитивных типов).Это не только оптимизация 1 . Мне не нравится
потому что это не выражает то, что я действительно хочу сделать 2 .
Я не хочу добавлять целое число к (пустой) строке. Я хочу преобразовать целое число в строку:
Или, не мой предпочтительный, но все же лучше, чем конкатенация, получить строковое представление объекта (целое число):
1. Для кода, который вызывается очень часто, как в циклах, оптимизация также является точкой отказа от конкатенации .
2. это недействительно для использования реальной конкатенации, как в
System.out.println("Index: " + i);
илиString id = "ID" + i;
источник
Многие вводные университетские курсы, кажется, учат этому стилю по двум причинам (по моему опыту):
Это не требует понимания классов или методов. Обычно этому учат задолго до того, как слово «класс» когда-либо упоминается, и даже не к вызовам методов. Так что использование чего-то подобного
String.valueOf(…)
сбило бы с толку студентов.Это иллюстрация «оператор перегрузки» - на самом деле, это было продан нам как в идиоматическом перегруженном операторе (маленькое чудо здесь, так как Java не позволяет пользовательский перегружать оператор).
Так что это может быть либо рождено из дидактической необходимости (хотя я бы сказал, что это просто плохое учение), либо использоваться для иллюстрации принципа, который в Java довольно сложно продемонстрировать.
источник
Выражение
приводит к конверсии строки из
i
во время выполнения. Общий тип выраженияString
.i
сначала преобразуется вInteger
объект (new Integer(i)
), затемString.valueOf(Object obj)
вызывается. Так что это эквивалентноОчевидно, что это немного менее эффективно, чем просто вызов,
String.valueOf(new Integer(i))
который даст тот же результат.Преимущество в
""+i
том, что печатать легче / быстрее, и некоторые люди могут подумать, что их легче читать. Это не запах кода, поскольку он не указывает на более глубокую проблему.(Ссылка: JLS 15.8.1 )
источник
String.valueOf
необходимого боксаi
(это не так, поскольку существует перегрузка, которая принимаетint
), он не будет использоватьnew Integer(i)
, он будет использоватьInteger.valueOf(i)
. Но это действительно не делает ничего из этого. Это такnew StringBuilder().append("").append(i).toString()
, как отмечает ответ SimonJ. StringBuilder имеет свою собственную логику для превращения примитива inti
в String.Лично я не вижу ничего плохого в этом коде.
Это очень полезно, когда вы хотите записать значение типа int, а регистратор просто принимает строку. Я бы сказал, что такое преобразование удобно, когда вам нужно вызвать метод, принимающий строку, но у вас есть значение типа int.
Что касается выбора между
Integer.toString
илиString.valueOf
, это все дело вкуса.... А внутри, кстати ,
String.valueOf
вызываетInteger.toString
метод. :)источник
Другой способ, которым я знаю, из
Integer
класса:Конкретный пример (хотя я не думаю, что вам нужен):
Это также работает для других примитивных типов, например
Double.toString
.Смотрите здесь для более подробной информации.
источник
Эту технику преподавали на начальном этапе обучения в классе Java, который я изучал более десяти лет назад. Однако, я должен отметить, что, IIRC, мы еще не получили методы класса String и Integer.
Техника проста и быстро набрать. Если все, что я делаю, это что-то печатаю, то я буду использовать это (например,
System.out.println("" + i);
однако. Я думаю, что это не лучший способ сделать преобразование, так как требуется время, чтобы понять, что происходит, когда он используется таким образом. Кроме того, если производительность является проблемой, она кажется медленнее (подробнее ниже, а также в других ответах).Лично я предпочитаю Integer.toString (), так как очевидно, что происходит. String.valueOf () будет моим вторым выбором, так как кажется, что это сбивает с толку (посмотрите комментарии после ответа Дарио).
Просто ради ухмылки :) Я написал классы для проверки трех методов: "" + i, Integer.toString и String.ValueOf. Каждый тест просто конвертировал целые числа от 1 до 10000 в строки. Затем я запускал каждую команду Linux time пять раз. Integer.toString () был немного быстрее, чем String.valueOf () один раз, они связывались три раза, а String.valueOf () был быстрее один раз; однако разница никогда не превышала пары миллисекунд.
Метод "" + i был медленнее, чем оба в каждом тесте, кроме одного, когда он был на 1 миллисекунду быстрее, чем Integer.toString (), и на 1 миллисекунду медленнее, чем String.valueOf () (очевидно, в том же тесте, где String.valueOf () был быстрее, чем Integer.toString ()). Хотя обычно это было всего на пару миллисекунд медленнее, был один тест, где он был примерно на 50 миллисекунд медленнее. YMMV .
источник
Существуют различные способы преобразования в строки:
источник
Это зависит от того, как вы хотите использовать свою строку. Это может помочь:
источник
В основном то же самое на SimonJ. Мне действительно не нравится "" + я идиома. Если вы скажете String.valueOf (i), Java преобразует целое число в строку и возвращает результат. Если вы говорите «+ i», Java создает объект StringBuilder, добавляет к нему пустую строку, преобразует целое число в строку, добавляет его в StringBuilder, а затем преобразует StringBuilder в строку. Это много дополнительных шагов. Полагаю, если ты сделаешь это однажды в большой программе, это не страшно. Но если вы делаете это все время, вы заставляете компьютер выполнять кучу дополнительной работы и создаете все эти дополнительные объекты, которые затем необходимо очистить. Я не хочу увлекаться микрооптимизацией, но и не хочу быть бессмысленно расточительным.
источник
Оба способа верны.
источник
Есть много способов преобразовать целое число в строку:
1)
2)
3)
4)
источник
Есть три способа преобразования в строки
String string = "" + i;
String string = String.valueOf(i);
String string = Integer.toString(i);
источник
String.format("%d", i)
.Использование "" + i - это самый короткий и простой способ преобразовать число в строку. Это не самое эффективное, но самое ясное ИМХО, и это, как правило, более важно. Чем проще код, тем меньше вероятность ошибиться.
источник
""+i
Лично я думаю, что "+" я выгляжу так, как в оригинальном плакате с вопросом "вонючий". Я использовал много ОО языков помимо Java. Если этот синтаксис задумывался как подходящий, то Java просто интерпретировала бы один i без необходимости "", как требуется для преобразования в строку, и делала бы это, поскольку тип назначения однозначен, а справа указывалось бы только одно значение. , Другое похоже на «обман», чтобы обмануть компилятор, плохое умение, когда рассматриваются разные версии Javac, сделанные другими производителями или с других платформ, если когда-либо нужно будет портировать код. Черт возьми, мне нравятся многие другие OOL просто возьмите Typecast: (String) я. подмигивает
Учитывая мой способ обучения и простоту понимания такой конструкции при быстром чтении чужого кода, я голосую за метод Integer.toString (i). Забывая ns или two в том, как Java реализует вещи в фоновом режиме по сравнению со String.valueOf (i), этот метод мне подходит и точно говорит, что происходит: у меня есть и Integer, и я хочу, чтобы он был преобразован в строку.
Хорошее замечание, сделанное пару раз, возможно, просто использование StringBuilder в начале - хороший ответ для построения строк, смешанных с текстом и целыми числами или другими объектами, поскольку это то, что в любом случае будет использоваться в фоновом режиме, верно?
Только мои два цента брошены в и без того хорошо оплачиваемую кошечку ответов на вопрос Мана ... улыбается
РЕДАКТИРОВАТЬ НА МОЙ СОБСТВЕННЫЙ ОТВЕТ ПОСЛЕ НЕКОТОРЫХ ОТРАЖЕНИЙ:
Хорошо, хорошо, я подумал об этом еще немного, и String.valueOf (i) также совершенно хорош, и он говорит: я хочу строку, которая представляет значение целого числа. LOL, английский намного сложнее разобрать, чем Java! Но я оставляю оставшуюся часть моего ответа / комментария ... Меня всегда учили использовать самый низкий уровень цепочки методов / функций, если это возможно, и все еще поддерживают читабельность, поэтому, если String.valueOf вызывает Integer.toString, тогда зачем использовать весь оранжевый если ты все равно будешь чистить его, хммм?
Чтобы прояснить мой комментарий о StringBuilder, я строю множество строк с комбинациями в основном буквального текста и целых чисел, и они становятся длинными и безобразными с вызовами вышеупомянутых подпрограмм, встроенных между +, так что мне кажется, если они становятся В любом случае, SB возражает, и у метода append есть перегрузки, может быть, будет чище просто продолжать и использовать его ... Так что я полагаю, что сейчас у меня до 5 центов, а? лол...
источник
использование
Integer.toString(tmpInt).trim();
источник
trim()
которая бы пригодилась здесь.Попробуйте простое приведение типов
источник
char c = (char) (i + 48);