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()
marcolopy
źródło
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.

Drelich
źródło
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.

okej
źródło
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.

fucho
źródło
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ą.

Dhiraj
źródło
13

Polecam również korzystanie

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

Prosty i skuteczny.

Jasper Holton
źródło
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).

Nathan Waite
źródło
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.

Dhiraj
źródło
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()
ryu
źródło
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.

Shiv Buyya
źródło
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.

Shailej Shimpi
źródło
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
Shiva Nandam Sirmarigari
źródło