Java int na String - Integer.toString (i) a nowa Integer (i) .toString ()


428

Czasami java mnie zastanawia.
Mam ogromną ilość int inicjalizacji .

Jaka jest prawdziwa różnica?

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

20
Po prostu bym użył "" + 42, ale hej, to ja. Formularz 2 da w wyniku nowy obiekt jako liczbę pośrednią (dla większości wartości i). To także więcej pisania.

16
@pst: jeśli obiekt pośredni jest dla ciebie problemem, "" + 42to nie jest lepszy, ponieważ wymaga produktu pośredniego, StringBuilderktóry jest znacznie cięższy niż Integer.
Joachim Sauer

47
„” + 42 może działać, ale to zły pomysł. Ludzie tacy jak ja przyjrzą się Twojemu kodowi i spróbują dowiedzieć się, co do cholery stało się z pustym ciągiem.
Mainguy,

3
Nie polecałbym, "" + 42ponieważ w przypadku dodawania ciągów liczb całkowitych możesz w końcu dodać wartości i nie zdawać sobie z tego sprawy.
BoltzmannBrain

20
Jeśli nie lubisz dużo pisać, prawdopodobnie nie powinieneś programować w Javie.
Adam Pierce

Odpowiedzi:


548

Integer.toStringwywołuje metodę statyczną w klasie Integer. Nie wymaga wystąpienia Integer.

Jeśli zadzwonisz new Integer(i), utwórz instancję typu Integer, która jest pełnym obiektem Java zawierającym wartość twojej int. Następnie należy wywołać toStringmetodę na to, aby poprosić go, aby powrócić ciąg znaków reprezentujący siebie .

Jeśli chcesz tylko wydrukować int , użyj pierwszego, ponieważ jest lżejszy, szybszy i nie zużywa dodatkowej pamięci (oprócz zwracanego ciągu).

Jeśli chcesz, aby obiekt reprezentujący wartość całkowitą - na przykład w celu umieszczenia go w kolekcji - użyjesz drugiego, ponieważ daje on pełnoprawny obiekt do robienia wszelkiego rodzaju rzeczy, których nie możesz zrobić od razu int.


96

new Integer(i).toString()najpierw tworzy wokół (nadmiarowy) obiekt otoki i(który sam może być obiektem otoki Integer).

Integer.toString(i) jest preferowany, ponieważ nie tworzy niepotrzebnych obiektów.


43

Inną opcją jest String.valueOfmetoda statyczna .

String.valueOf(i)

Wydaje mi się to nieco bardziej właściwe niż Integer.toString(i)dla mnie. Gdy zmieni się typ i, na przykład od intdo double, kod pozostanie poprawny.


2
Tak. Chyba że musisz użyć RADIX (w takim przypadku musisz użyć Integer.toString)
marcolopes,

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

    Ta instrukcja tworzy obiekt liczby całkowitej, a następnie wywołuje jej metody, toString(i)aby zwrócić ciąg reprezentujący wartość liczby całkowitej .

  2. Integer.toString(i);

    To zwraca obiekt String reprezentujący int konkretne (integer) , ale tutaj toString(int)jest staticmetoda.

Podsumowanie w pierwszym przypadku zwraca ciąg znaków reprezentujący ciąg obiektów, a tak jak w drugim przypadku ciąg znaków reprezentuje liczbę całkowitą.


13

Polecam również korzystanie

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

Prosty i skuteczny.


38
jest to zdecydowanie zła forma, ponieważ oba polegają na dość subtelnej części języka Java i są mniej wydajne niż Integer.toString (i). Zobacz ten post SO
rickcnagy

To może być nieefektywne. Sugeruję użycie konwencjonalnych opcji, takich jak Integer.toString lub String.valueOf. Sprawdź tutaj javadevnotes.com/java-integer-to-string-examples
JavaDev

Generalnie źle jest robić rzeczy w tak nieintuicyjny sposób. Bardziej oczywiste opcje, takie jak Integer.toString()użycie dodatkowych naciśnięć klawiszy, są jednak znacznie wyraźniejsze, co ma kluczowe znaczenie, gdy chcesz zachować kod.
Calvin Li

Czy nie wywołałoby to automatycznie toString()metody zmiennej całkowitej ?
Ankit Deshpande

11

Chociaż podoba mi się zalecenie fhucho dotyczące

String.valueOf(i)

Ironią jest to, że ta metoda faktycznie wywołuje

Integer.toString(i)

Tak więc użyj String.valueOf(i) jeśli podoba ci się to, jak to czyta i nie potrzebujesz podstawki, ale także wiedząc, że jest mniej wydajna niż Integer.toString(i).


4

Jeśli chodzi o pomiar wydajności, jeśli rozważasz wydajność czasową, to Integer.toString (i); jest drogi, jeśli dzwonisz mniej niż 100 milionów razy. W przeciwnym razie, jeśli jest to ponad 100 milionów wywołań, nowa liczba całkowita (10) .toString () będzie działać lepiej.

Poniżej znajduje się kod, za pomocą którego możesz spróbować zmierzyć wydajność,

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));
    }

Pod względem pamięci

nowa liczba całkowita (i) .toString ();

zajmie więcej pamięci, ponieważ za każdym razem utworzy obiekt, więc nastąpi fragmentacja pamięci.


2
Wkleiłem ten kod w IntelliJ IDEA i dostałem ostrzeżenie: „ new Integer(10).toString() can be simplified to Integer.toString(10)
oksayt

Ten kod działa dla mnie. Dostaję około 420 milisekund dla Integer.toString (10) i 525 milisekund dla nowego Integer (10) .toString ()
Jake Stevens-Haas


Pomógłby najpierw rozgrzać się, w przeciwnym razie wyniki nie są ważne!
sixones

Jeśli mówisz, że jeden jest drogi w jednym przypadku, a drugi jest lepszy w drugim przypadku, oznacza to, że drugi jest lepszy / niedrogi w każdej sytuacji.
Sgene9,

2

Lepszy:

Integer.valueOf(i).toString()

9
Dlaczego to jest lepsze?
Emile,

1
Myślę, że tak jest lepiej, ponieważ jak zauważył @Dhiraj, jeśli chodzi o pamięć, „nowa liczba całkowita (i) .toString ();” zajmie więcej pamięci, ponieważ tworzy nowy obiekt zamiast po prostu uzyskać wartość całkowitą i przekonwertować ją na ciąg.
Patricia,

4
@Lucy Integer.valueOf (i) zwraca nową liczbę całkowitą, więc nie ma różnicy
inigoD

W ogóle nie udzielasz odpowiedzi na pytanie. Pytanie brzmi, jaka jest różnica między bla a bla, a nie jaki jest lepszy zamiennik bla.
ahitt6345,

2

Prosty sposób jest po prostu połączony ""z liczbą całkowitą:

int i = 100;

String s = "" + i;

teraz sbędzie miał 100wartość ciągu.


1

Tutaj Integer.toStringwywołuje metodę statyczną w klasie Integer. Nie wymaga wywołania obiektu.

Jeśli zadzwonisz new Integer(i), najpierw utwórz instancję typu Integer, która jest pełnym obiektem Java hermetyzującym wartość twojego int. Następnie wywołujesz na nim toStringmetodę, aby poprosić ją o zwrócenie reprezentacji ciągu.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.