2016-10-31 15 views
7

Właśnie przeczytałem o tej funkcji Java 9 https://bugs.openjdk.java.net/browse/JDK-8085796, mówiąc, że poprawiona zostanie "wolna" konkatenacja ciągów przy użyciu StringBuilder.Java 9 integer to String obsada

Moje pytanie brzmi, czy nadal istnieją jakieś wady stosowania int stringów w następujący sposób?

int i = 16; 
String s = ""+i; 

Czy są jakieś plusy/minusy odlewania int na ciąg wykorzystujące Integer.toString(i) lub String.valueOf(i)?

Edycja: Ponieważ moje pytanie było zbyt oparte na opiniach (sry za to) zmieniłem to. Interesują mnie pozytywne lub negatywne strony różnych odlewów. I każdy powinien sam zdecydować, którego użyć.

+15

Krótszy, tak. Łatwiej zrozumieć? Nie sądzę. 'Integer.parseInt' jest czerwonym śledziem, ponieważ idzie w przeciwnym kierunku - 'String.valueOf (i)' mówi * dokładnie * co robi. Twoim celem nie jest wykonywanie konkatenacji ciągów, więc dlaczego twój kod zawierałby konkatenację ciągów? –

+1

Ulepszona nie oznacza, że ​​jest tak szybka. Osobiście wolę używać '' "+ i' (chyba że jest problem z wydajnością), ale to kwestia gustu. –

+1

" Łatwiej zrozumieć "jest subiektywne. – shmosel

Odpowiedz

5

Przede wszystkim nie istnieje założenie, że Integer.toString(i) jest zawsze szybszy niż .

Przede wszystkim, jeśli i jest stałą czasową kompilacji, ""+i będzie również, w przeciwieństwie do String.valueOf(i). Oczywiście, jeśli definicja jest podobna do final int i=16;, czytelnicy sprzeciwi się użyciu ""+i, jako "16" będą znacznie jaśniejsze. Ale jeśli mówimy o final int DEFAULT_USER = DEFAULT_GROUP << GROUP_BIT;, ""+DEFAULT_USER jest o wiele jaśniejsze niż literał zawierający rzeczywistą liczbę. A bycie stałą w czasie kompilacji to coś więcej niż problem z wydajnością, pozwala na użycie ciągu w adnotacjach lub etykietach switch.

Jeśli i nie jest stałą czasu kompilacji, nie ma obowiązkowej postaci skompilowanej, więc w zasadzie kompilatory mogą mimo wszystko kompilować ""+i do Integer.toString(i). Jeśli porównamy zwykłą naiwną (lub nazwijmy to "prosto") implementację new StringBuilder().append("").append(i).toString() z wersją Integer.toString(i) lub hipotetyczną zoptymalizowaną implementacją Java 9, tylko ostatnia akcja kopiowania z bufora StringBuilder do tablicy wartości wyniku String może mieć wpływ na wydajność, ale może to zostać zoptymalizowane przez maszynę wirtualną HotSpot JVM. Druga kwestia, której celem jest rozwiązanie Java 9, początkowa pojemność StringBuilder, nie ma tutaj znaczenia, ponieważ reprezentacja ciągów int z łatwością mieści się w domyślnej pojemności 16char s.

Dla większości nietrywialnych int wartości, koszty konwersji do postaci dziesiętnej będzie przewyższać inne koszty znacznie, więc jeśli wolisz ""+i nad Integer.toString(i) nie należy pozwolić obawy wydajności być powodem, aby go nie używać. Oznacza to również, że nie należy oczekiwać dramatycznego przyspieszenia przy implementacji Java 9. Główna operacja jest wciąż taka sama.

Myślę, że największym ulepszeniem rozwiązania Java 9 jest redukcja rozmiaru kodu o wartości , ponieważ wszystkie te podobne sekwencje wywołania, generowane dla każdego wyrażenia konkatenacji ciągów, będą składane do jednej instrukcji (co jest szczególnie istotne dla konkatenacje wielu wyrażeń). Możliwość poprawy wydajności, to tylko miły dodatek, ale nie spodziewałbym ulepszenia być dramatyczna, a zwłaszcza nie w pierwszych wersjach JRE 9.

Więc decyzja między ""+i i Integer.toString(i) lub String.valueOf(i) jest tylko stylistycznym pytaniem (o czym tu nie mówimy), a nie kwestią wydajności.

+0

Stała czasu kompilacji jest bardzo interesująca. Wielkie dzięki za tę szczegółową odpowiedź. –