Java от int до String - Integer.toString (i) против нового Integer (i) .toString ()

Иногда java меня озадачивает.
Мне нужно выполнить огромное количество инициализаций int.

В чем реальная разница?

  1. Integer.toString(i)
  2. new Integer(i).toString()

person marcolopes    schedule 14.10.2010    source источник
comment
Я бы просто использовал "" + 42, но это я. Форма № 2 приведет к созданию нового целочисленного объекта (для большинства значений i) в качестве промежуточного. Это также больше печатает.   -  person    schedule 14.10.2010
comment
@pst: если промежуточный объект является для вас проблемой, то "" + 42 ничуть не лучше, так как он требует промежуточного StringBuilder, который намного тяжелее, чем Integer.   -  person Joachim Sauer    schedule 14.10.2010
comment
+ 42 может сработать, но это плохая идея. Такие люди, как я, будут смотреть на ваш код и пытаться выяснить, что, черт возьми, случилось с пустой строкой.   -  person Mainguy    schedule 27.12.2010
comment
Я бы не рекомендовал "" + 42, потому что в случае добавления строк целых чисел вы можете добавить значения, не осознавая этого.   -  person BoltzmannBrain    schedule 03.04.2015
comment
@ alavin89, здесь мы говорим о Java, этого точно не будет. Однако действительное предупреждение в случае JS и подобных языков.   -  person Veselin Romić    schedule 05.04.2015
comment
Если вам не нравится много печатать, то, вероятно, вам не следует программировать на Java.   -  person Adam Pierce    schedule 22.05.2015
comment
Я лично предпочитаю String.valueOf(), потому что его можно использовать для любого типа.   -  person shmosel    schedule 02.08.2016
comment
Как насчет использования форматированной строки: String.format (% d, i);   -  person Wouter    schedule 31.10.2016


Ответы (10)


Integer.toString вызывает статический метод в классе Integer. Экземпляр Integer не требуется.

Если вы позвоните new Integer(i) вы создаете экземпляр типа Integer, который представляет собой полный объект Java, инкапсулирующий значение вашего int. Затем вы вызываете для него метод toString, чтобы попросить его вернуть строковое представление самого.

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

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

person Jean    schedule 14.10.2010

new Integer(i).toString() сначала создает (избыточный) объект-оболочку вокруг i (который сам может быть объектом-оболочкой Integer).

Integer.toString(i) предпочтительнее, потому что он не создает ненужных объектов.

person oksayt    schedule 14.10.2010

Другой вариант - статический метод String.valueOf.

String.valueOf(i)

Мне он кажется немного более подходящим, чем Integer.toString(i). При изменении типа i, например с int на double, код останется правильным.

person fhucho    schedule 16.11.2014
comment
да. Если вы не должны использовать RADIX (в этом случае вы должны использовать Integer.toString) - person marcolopes; 17.11.2014

  1. new Integer(i).toString();

    Этот оператор создает объект Integer, а затем вызывает его методы toString(i), чтобы вернуть строковое представление значения Integer.

  2. Integer.toString(i);

    Он возвращает объект String, представляющий конкретное целое число (int), но здесь toString(int) - это метод static.

Сводка в первом случае возвращает строковое представление объектов, а, как и во втором случае, возвращает строковое представление целого числа.

person Dhiraj    schedule 14.10.2010

Я также очень рекомендую использовать

int integer = 42;
String string = integer + "";

Просто и эффективно.

person Jasper Holton    schedule 06.09.2013
comment
это определенно плохой тон, потому что он и полагается на довольно тонкую часть языка Java, и менее эффективен, чем Integer.toString (i). См. это сообщение SO - person rickcnagy; 21.11.2013
comment
Это могло быть неэффективно. Я предлагаю использовать некоторые стандартные варианты, например Integer.toString или String.valueOf. Проверьте здесь javadevnotes.com/java-integer-to-string-examples - person JavaDev; 15.02.2015
comment
Как правило, делать что-то таким неинтуитивным образом - плохая идея. Более очевидные варианты, такие как Integer.toString(), могут потребовать дополнительных нажатий клавиш, но они намного яснее, что очень важно, если вы хотите сохранить код. - person Calvin Li; 03.03.2015
comment
Разве это не вызовет автоматически метод toString() целочисленной переменной? - person Ankit Deshpande; 06.10.2015

Хотя мне нравится рекомендация fhucho

String.valueOf(i)

Ирония заключается в том, что этот метод на самом деле вызывает

Integer.toString(i)

Таким образом, используйте String.valueOf(i), если вам нравится, как он читается, и вам не нужен radix, но вы также знаете, что он менее эффективен, чем Integer.toString(i).

person Nathan Waite    schedule 06.11.2015

С точки зрения измерения производительности, если вы учитываете временную производительность, то Integer.toString (i); стоит дорого, если вы звоните менее 100 миллионов раз. В противном случае, если это более 100 миллионов вызовов, то new Integer (10) .toString () будет работать лучше.

Ниже приведен код, через который вы можете попытаться измерить производительность,

public static void main(String args[]) {
            int MAX_ITERATION = 10000000;
        long starttime = System.currentTimeMillis();
        for (int i = 0; i < MAX_ITERATION; ++i) {
            String s = Integer.toString(10);
        }
        long endtime = System.currentTimeMillis();
        System.out.println("diff1: " + (endtime-starttime));

        starttime = System.currentTimeMillis();
        for (int i = 0; i < MAX_ITERATION; ++i) {
            String s1 = new Integer(10).toString();
        }
        endtime = System.currentTimeMillis();
        System.out.println("diff2: " + (endtime-starttime));
    }

Что касается памяти,

новое целое число (i) .toString ();

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

person Dhiraj    schedule 14.10.2010
comment
Я вставил этот код в IntelliJ IDEA и получил предупреждение: new Integer(10).toString() can be simplified to Integer.toString(10) - person oksayt; 15.10.2010
comment
Этот код у меня работает. Я получаю около 420 миллисекунд для Integer.toString (10) и 525 миллисекунд для нового Integer (10) .toString () - person Jake Stevens-Haas; 12.12.2010
comment
См. stackoverflow.com/questions/504103/ ... - person Petr Tuma; 21.08.2013
comment
Помогло бы сначала разогреться, иначе результаты недействительны! - person sixones; 21.09.2016
comment
Если вы говорите, что одно дорогое в одном случае, а другое лучше в другом, это означает, что другой лучше / недорого во всех ситуациях. - person Sgene9; 30.08.2017

Лучше:

Integer.valueOf(i).toString()
person ryu    schedule 25.08.2014
comment
Я думаю, что это лучше, потому что, как заметил @Dhiraj, с точки зрения памяти новый Integer (i) .toString (); займет больше памяти, потому что он создает новый объект вместо того, чтобы просто получить значение Integer и преобразовать его в строку. - person Patricia; 10.09.2014
comment
@Lucy Integer.valueOf (i) возвращает новое целое число, поэтому нет никакой разницы - person inigoD; 27.02.2015
comment
Вы вообще не даете ответа на вопрос. Вопрос в том, в чем разница между бла и бла, а не в том, что лучше заменить бла. - person ahitt6345; 26.12.2016

Простой способ - просто объединить "" с целым числом:

int i = 100;

String s = "" + i;

теперь s будет иметь 100 как строковое значение.

person Shiv Buyya    schedule 17.08.2016

Здесь Integer.toString вызывает статический метод класса Integer. Он не требует вызова объекта.

Если вы вызываете new Integer(i), вы сначала создаете экземпляр типа Integer, который представляет собой полный объект Java, инкапсулирующий значение вашего int i. Затем вы вызываете для него метод toString, чтобы попросить его вернуть строковое представление самого себя.

person Shailej Shimpi    schedule 14.08.2015