Как преобразовать из int в String?

Я работаю над проектом, где все преобразования из int to String делается так:

int i = 5;
String strI = "" + i;

Я не знаком с Java. Это обычная практика или что-то не так, как я полагаю?

19 ответов


нормальные способы были бы Integer.toString(i) или String.valueOf(i).

конкатенация будет работать, но это нетрадиционно и может быть плохим запахом, поскольку он предполагает, что автор не знает о двух методах выше (что еще они могут не знать?).

Java имеет специальную поддержку оператора + при использовании со строками (см. документация), который переводит код, который вы разместили в:

StringBuilder sb = new StringBuilder();
sb.append("");
sb.append(i);
String strI = sb.toString();

во время компиляции. Это немного менее эффективно (sb.append() заканчивает вызов Integer.getChars(), что Integer.toString() сделал бы в любом случае), но он работает.

чтобы ответить на комментарий Grodriguez: * * нет, компилятор не оптимизируйте пустую строку в этом случае-посмотрите:

simon@lucifer:~$ cat TestClass.java
public class TestClass {
  public static void main(String[] args) {
    int i = 5;
    String strI = "" + i;
  }
}
simon@lucifer:~$ javac TestClass.java && javap -c TestClass
Compiled from "TestClass.java"
public class TestClass extends java.lang.Object{
public TestClass();
  Code:
   0:    aload_0
   1:    invokespecial    #1; //Method java/lang/Object."<init>":()V
   4:    return

public static void main(java.lang.String[]);
  Code:
   0:    iconst_5
   1:    istore_1

инициализируйте StringBuilder:

   2:    new    #2; //class java/lang/StringBuilder
   5:    dup
   6:    invokespecial    #3; //Method java/lang/StringBuilder."<init>":()V

добавить пустую строку:

   9:    ldc    #4; //String
   11:    invokevirtual    #5; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;

добавить целое число:

   14:    iload_1
   15:    invokevirtual    #6; //Method java/lang/StringBuilder.append:
(I)Ljava/lang/StringBuilder;

извлечь последнюю строку:

   18:    invokevirtual    #7; //Method java/lang/StringBuilder.toString:
()Ljava/lang/String;
   21:    astore_2
   22:    return
}

там предложение и текущая работа по изменению этого поведения, нацеленная на JDK 9.


это приемлемо, но я никогда не писал ничего подобного. Я бы предпочел это:

String strI = Integer.toString(i);

это не лучший способ.

при выполнении преобразования из int в string это должно использоваться:

int i = 5;
String strI = String.valueOf(i);

Это не только оптимизация1. Мне не нравится

"" + i

потому что это не выражает того, что я действительно хочу сделать 2.

Я не хочу добавлять целое число в (пустую) строку. Я хочу преобразовать целое число в строку:

Integer.toString(i)

или, не мой предпочтительный, но все же лучше, чем конкатенация, получить строковое представление объекта (целое число):

String.valueOf(i)

1. для кода, который называется very часто, как и в циклах, оптимизация также является точкой для не использования конкатенации.

2. это недопустимо для использования реальная конкатенация как в System.out.println("Index: " + i); или String id = "ID" + i;


многие вводные университетские курсы, похоже, преподают этот стиль по двум причинам (по моему опыту):

  • это не требует понимания классов или методов. Обычно это преподается задолго до того, как слово" класс " когда – либо упоминается-и даже не вызывает метод. Итак, используя что-то вроде String.valueOf(…) будет путать студентов.

  • это иллюстрация "перегрузки оператора" - фактически, это было продано нам как на идиоматический перегруженный оператор (неудивительно, что Java не позволяет перегружать пользовательский оператор).


выражение

"" + i

ведет к преобразования строки of i во время выполнения. Общий тип выражения String. i сначала преобразуется в


лично я не вижу ничего плохого в этом коде.

это довольно полезно, когда вы хотите зарегистрировать значение int, и регистратор просто принимает строку. Я бы сказал, что такое преобразование удобно, когда вам нужно вызвать метод, принимающий строку, но у вас есть значение типа int.

что касается выбора между Integer.toString или String.valueOf, это все дело вкуса.
...И внутренне,String.valueOf называет Integer.toString способ кстати. :)


другой способ, о котором я знаю, - от Integer класс:

Integer.toString(int n);
Integer.toString(int n, int radix);

конкретный пример (хотя я не думаю, что вам это нужно):

String five = Integer.toString(5); // returns "5"

Это также работает для других примитивных типов, например Double.toString.

Подробнее см. здесь.


этот метод преподавался в классе введения в Java на уровне бакалавриата, который я взял более десяти лет назад. Однако я должен отметить, что, IIRC, мы еще не добрались до методов класса String и Integer.

метод прост и быстр для того чтобы напечатать. Если все, что я делаю, это печатаю что-то, я буду использовать его (например,System.out.println("" + i);. Однако я думаю, что это не лучший способ сделать преобразование, так как требуется секунда мысли, чтобы понять, что происходит, когда он используется таким образом. Кроме того, если производительность вызывает беспокойство, она кажется медленнее (подробнее ниже, а также в других ответах).

лично я предпочитаю Integer.toString (), поскольку очевидно, что происходит. Строка.valueOf () был бы моим вторым выбором, так как это кажется запутанным (свидетель комментариев после ответа darioo).

Just for grins :) я написал классы для тестирования трех методов: "" + i, Integer.toString и String.Метод valueOf. Каждый тест только что преобразовал ints от 1 до 10000 в строки. Затем я запустил каждый через Linux времени команда пять раз. Целое число.toString () был немного быстрее, чем String.valueOf () один раз они связали три раза и строку.valueOf () был быстрее один раз; однако разница никогда не превышала пары миллисекунд.

метод "" + i был медленнее обоих в каждом тесте, кроме одного, когда он был на 1 миллисекунду быстрее целого числа.toString () и на 1 миллисекунду медленнее, чем String.valueOf () (очевидно, на том же тесте, где Строка.valueOf () был быстрее, чем Integer.toString ()). Хотя обычно он был всего на пару миллисекунд медленнее, был один тест, где он был примерно на 50 миллисекунд медленнее. YMMV.


существуют различные способы преобразования в строки:

StringBuilder string = string.append(i).toString();
String string = String.valueOf(i);
String string = Integer.toString(i);

Это зависит от того, как вы хотите использовать ваши строки. Это может помочь:

String total =  Integer.toString(123) + Double.toString(456.789);

существует много способов преобразования целого числа в строку:

1)

Integer.toString(10);

2)

 String hundred = String.valueOf(100); // You can pass an int constant
 int ten = 10;
 String ten = String.valueOf(ten)

3)

String thousand = "" + 1000; // String concatenation

4)

String million = String.format("%d", 1000000)

String strI = String.valueOf(i);

String string = Integer.toString(i);

оба способа верны.


в основном то же самое на SimonJ. Мне очень не нравится идиома ""+i. Если вы говорите Струна.valueOf (i), Java преобразует целое число в строку и возвращает результат. Если вы говорите "" +i, Java создает объект StringBuilder, добавляет к нему пустую строку, преобразует целое число в строку, добавляет Это к StringBuilder, а затем преобразует StringBuilder в строку. Это много дополнительных шагов. Я полагаю, если вы делаете это один раз в большой программе, это не имеет большого значения. Но если ты делаешь это все время, ты заставляя компьютер делать кучу дополнительной работы и создавая все эти дополнительные объекты, которые затем должны быть очищены. Я не хочу быть фанатиком микро-оптимизации, но я также не хочу быть бессмысленно расточительным.


использование "" + i-самый короткий и простой способ преобразования числа в строку. Это не самый эффективный, но это самый ясный ИМХО, и это обычно более важно. Чем проще код, тем меньше вероятность ошибиться.


существует три способа преобразования в строки

  1. строка string = "" + i;
  2. String string = строка.valueOf (i);
  3. String string = целое число.toString (i);

лично я думаю, что "" + я действительно смотрю, как оригинальный плакат вопроса гласит "вонючий". Я использовал много языков OO, кроме Java. Если этот синтаксис был предназначен, чтобы быть уместным тогда Java будет просто интерпретировать только я без "", так как желал быть преобразован в строку и сделать это с назначения тип однозначна и только одно значение будет поставляемого справа. Другой кажется "трюком", чтобы обмануть компилятор, плохой Моджо, когда разные версии Javac, сделанные другими производителями или с других платформ, считаются, если код когда-либо должен быть портирован. Черт возьми, за мои деньги он должен, как и многие другие ул, просто взять типаж: (строка) i. Винкс

учитывая мой способ обучения и для удобства понимания такой конструкции при чтении кода других быстро я голосую за целое число.метод toString(I) метод. Забывая ns или два в том, как Java реализует вещи в фоновом режиме против строки.valueOf (i) Этот метод чувствует прямо мне и говорит, что именно происходит: у меня есть и целое число, и я хочу, чтобы оно было преобразовано в строку.

хороший момент, сделанный пару раз, возможно, просто использует StringBuilder спереди-хороший ответ на построение строк, смешанных с текстом и ints или другими объектами, так как это то, что будет использоваться в фоновом режиме в любом случае правильно?

просто мои два цента, брошенные в уже хорошо оплаченный котенок ответов на вопрос мужчины... улыбается

РЕДАКТИРОВАТЬ МОЙ СОБСТВЕННЫЙ ОТВЕТ ПОСЛЕ НЕКОТОРОГО РАЗМЫШЛЕНИЯ:

хорошо, Хорошо, я думал об этом еще немного и строка.valueOf (i) также отлично подходит: мне нужна строка, представляющая значение целого числа. lol, английский намного сложнее разобрать, чем Java! Но, я оставляю остальную часть моего ответа / комментария... Меня всегда учили использовать самый низкий уровень цепочки методов / функций, если это возможно, и по-прежнему поддерживает читаемость так что если строка.valueOf вызывает целое число.toString тогда зачем использовать целый апельсин, если вы просто собираетесь очистить его в любом случае, Хммм?

чтобы уточнить мой комментарий о StringBuilder, я создаю много строк с комбо в основном буквального текста и int, и они оказываются длинными и уродливыми с вызовами вышеупомянутых подпрограмм, встроенных между+, поэтому мне кажется, что если они становятся объектами SB в любом случае, и метод append имеет перегрузки, это может быть чище просто идти вперед и использовать его... Так что я думаю Я теперь на 5 центов больше, да? лол...


использовать Integer.toString(tmpInt).trim();


попробуйте простой typecasting

char c = (char) i;