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


428

Іноді ява спантеличує мене.
У мене є величезна кількість ініціалізації int .

Яка реальна різниця?

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

20
Я б просто користувався "" + 42, але ей, це я. Форма №2 призведе до отримання нового цілого об'єкта (для більшості значень i) як проміжного. Це також більше вводити текст.

16
@pst: якщо проміжний об’єкт є проблемою для вас, тоді "" + 42це не краще, оскільки для нього потрібен проміжний продукт, StringBuilderякий набагато важчий за an Integer.
Йоахім Зауер

47
"" + 42 може спрацювати, але це погана ідея. Такі люди, як я, завітають до вашого коду і спробують розібратися, що, до біса, трапилось із порожнім рядком.
Mainguy

3
Я б не рекомендував, "" + 42тому що у разі додавання рядків цілих чисел ви можете в кінцевому підсумку додати значення та не реалізувати їх.
BoltzmannBrain

20
Якщо вам не подобається багато вводити текст, ви, ймовірно, не повинні програмувати на Java.
Адам Пірс

Відповіді:


548

Integer.toStringвикликає статичний метод у класі Integer. Для цього не потрібен примірник Integer.

Якщо ви телефонуєте, new Integer(i)ви створюєте екземпляр типу Integer, який є повноцінним об'єктом Java, інкапсулюючи значення вашого int. Потім ви викликаєте toStringметод на ньому, щоб попросити повернути рядок про себе .

Якщо все, що вам потрібно, це надрукувати int, ви будете використовувати перший, оскільки він легший, швидший і не використовує додаткової пам'яті (окрім повернутого рядка).

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


96

new Integer(i).toString()спочатку створює навколо iсебе (надлишковий) обгортковий об'єкт (який сам може бути об’єктом обгортки Integer).

Integer.toString(i) є кращим, оскільки він не створює зайвих об'єктів.


43

Інший варіант - статичний String.valueOfметод.

String.valueOf(i)

Це почувається трохи правильніше, ніж Integer.toString(i)до мене. Коли тип i зміниться, наприклад, з intна double, код залишиться правильним.


2
Так. Якщо ви не повинні використовувати RADIX (у такому випадку ви повинні використовувати Integer.toString)
marcolopes

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

    Це твердження створює об'єкт Цілого числа, а потім викликає його методи toString(i)для повернення String-репрезентації значення Integer .

  2. Integer.toString(i);

    Він повертає об'єкт String , який представляє конкретний INT (ціле число) , але тут toString(int)це staticметод.

Підсумок у першому випадку повертає подання рядка об'єктів, де, як і у другому випадку, повертає рядкове представлення цілого числа.


13

Я також настійно рекомендую використовувати

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

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


38
це, безумовно, погана форма, оскільки обидва вони покладаються на досить тонку частину мови Java і менш ефективні, ніж Integer.toString (i). Дивіться цю публікацію SO
rickcnagy

Це може бути неефективним. Я пропоную використовувати деякі звичайні варіанти, такі як Integer.toString або String.valueOf. Перевірте тут javadevnotes.com/java-integer-to-string-examples
JavaDev

Взагалі погана ідея робити такі неінтуїтивні способи. Більш очевидні варіанти на зразок Integer.toString()можуть використовувати додаткові натискання клавіш, але вони набагато чіткіші, що важливо, коли потрібно підтримувати код.
Кальвін Лі

Чи не буде цей toString()метод автоматично викликати цілочисленну змінну ?
Анкіт Дешпанде

11

Хоча мені подобаються рекомендації фухо

String.valueOf(i)

Іронія полягає в тому, що цей метод насправді викликає

Integer.toString(i)

Таким чином, використовуйте, String.valueOf(i)якщо вам подобається, як він читає, і вам не потрібен радіокс, але також знаючи, що він менш ефективний, ніж Integer.toString(i).


4

Що стосується вимірювання продуктивності, якщо ви розглядаєте показники часу, то Integer.toString (i); дорого, якщо ви телефонуєте менше 100 мільйонів разів. Ще якщо більше 100 мільйонів дзвінків, то новий 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));
    }

З точки зору пам'яті, то

новий Integer (i) .toString ();

займе більше пам’яті, оскільки щоразу створюватиме об’єкт, тому трапиться фрагментація пам’яті.


2
Я встав цей код в IntelliJ IDEA і отримав попередження: " new Integer(10).toString() can be simplified to Integer.toString(10)"
oksayt

Цей код працює для мене. Я отримую близько 420 мілісекунд для Integer.toString (10) і 525 мілісекунд для нового Integer (10) .toString ()
Джейк Стівенс-Хаас


Допоможе спочатку розігрітися, інакше результати не вірні!
шістсони

Якщо ви говорите, що одне в одному випадку коштує дорого, а інше - в іншому, це означає, що інше краще / недороге в будь-якій ситуації.
Sgene9

2

Краще:

Integer.valueOf(i).toString()

9
Чому це краще?
Еміль

1
Я думаю, що це краще, тому що, як @Dhiraj вказував, що з точки зору пам'яті, "новий Integer (i) .toString ();" буде потрібно більше пам’яті, оскільки він створює новий об’єкт, а не просто отримує значення Integer і перетворює його в рядок.
Патрісія

4
@Lucy Integer.valueOf (i) повертає новий Integer, тому різниці немає
inigoD

Ви взагалі не даєте відповіді на запитання. Питання в тому, в чому різниця між благом і благом, а не в тому, що є кращою заміною благу.
ahitt6345

2

Простий спосіб просто з'єднати ""з цілим числом:

int i = 100;

String s = "" + i;

тепер sматиме 100як рядкове значення.


1

Тут Integer.toStringвикликує статичний метод у класі Integer. Він не вимагає виклику об'єкта.

Якщо ви зателефонували new Integer(i)вам, спершу створіть екземпляр типу Integer, який є повноцінним об’єктом Java, який інкапсулює значення вашого int i. Потім ви викликаєте toStringметод на ньому, щоб попросити повернути рядок про себе.


0

1.Integer.toString(i)

Integer i = new Integer(8);
    // returns a string representation of the specified integer with radix 8
 String retval = i.toString(516, 8);
System.out.println("Value = " + retval);

2.new Integer(i).toString()

 int i = 506;

String str = new Integer(i).toString();
System.out.println(str + " : " + new Integer(i).toString().getClass());////506 : class java.lang.String
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.