Преобразуване на String в int или Integer в Java

1. Въведение

Преобразуването на String в int или Integer е много често срещана операция в Java. В тази статия ще покажем множество начини за справяне с този проблем.

Има няколко прости начина за справяне с това основно преобразуване.

2. Integer.parseInt ()

Една от основните решения е да се използват Integer , целевата метод статично: parseInt () , която връща примитивен вътр стойност :

@Test public void givenString_whenParsingInt_shouldConvertToInt() { String givenString = "42"; int result = Integer.parseInt(givenString); assertThat(result).isEqualTo(42); }

По подразбиране методът parseInt () приема, че даденият String е цяло число от base-10. Освен това този метод приема друг аргумент за промяна на този радиус по подразбиране . Например, можем да анализираме двоични String s, както следва:

@Test public void givenBinaryString_whenParsingInt_shouldConvertToInt() { String givenString = "101010"; int result = Integer.parseInt(givenString, 2); assertThat(result).isEqualTo(42); }

Естествено е възможно този метод да се използва и с всеки друг радикс като 16 (шестнадесетичен) или 8 (осмичен).

3. Integer.valueOf ()

Друг вариант би бил използването на статичния метод Integer.valueOf () , който връща екземпляр Integer :

@Test public void givenString_whenCallingIntegerValueOf_shouldConvertToInt() { String givenString = "42"; Integer result = Integer.valueOf(givenString); assertThat(result).isEqualTo(new Integer(42)); }

По същия начин методът valueOf () също приема персонализиран радикс като втори аргумент:

@Test public void givenBinaryString_whenCallingIntegerValueOf_shouldConvertToInt() { String givenString = "101010"; Integer result = Integer.valueOf(givenString, 2); assertThat(result).isEqualTo(new Integer(42)); }

3.1. Цялостен кеш

На пръв поглед може да изглежда, че методите valueOf () и parseInt () са абсолютно еднакви. В по-голямата си част това е вярно - дори методът valueOf () делегира вътрешно метода parseInt .

Въпреки това, има една малка разлика между тези два метода: на valueOf () метод е чрез използване на кеш число вътрешно . Този кеш ще върне същия Integer екземпляр за числа между -128 и 127 :

@Test public void givenString_whenCallingValueOf_shouldCacheSomeValues() { for (int i = -128; i <= 127; i++) { String value = i + ""; Integer first = Integer.valueOf(value); Integer second = Integer.valueOf(value); assertThat(first).isSameAs(second); } }

Ето защо е силно препоръчително да използвате valueOf () вместо parseInt () за извличане на полета с цели числа, тъй като това може да доведе до по-добър общ отпечатък за нашето приложение.

4. Конструктор на цяло число

Можете също така да използвате конструктора на Integer :

@Test public void givenString_whenCallingIntegerConstructor_shouldConvertToInt() { String givenString = "42"; Integer result = new Integer(givenString); assertThat(result).isEqualTo(new Integer(42)); }

От Java 9 този конструктор е остарял в полза на други статични фабрични методи като valueOf () или parseInt () . Дори преди това оттегляне, рядко е било подходящо да се използва този конструктор. Трябва да използваме parseInt (), за да преобразуваме низ в примитив int или да използваме valueOf (), за да го преобразуваме в Integer обект.

5. Integer.decode ()

Също така, Integer.decode () работи подобно на Integer.valueOf (), но може да приема и различни представяния на числа:

@Test public void givenString_whenCallingIntegerDecode_shouldConvertToInt() { String givenString = "42"; int result = Integer.decode(givenString); assertThat(result).isEqualTo(42); }

6. NumberFormatException

Всички споменати по-горе методи хвърлят NumberFormatException, когато срещат неочаквани String стойности. Тук можете да видите пример за такава ситуация:

@Test(expected = NumberFormatException.class) public void givenInvalidInput_whenParsingInt_shouldThrow() { String givenString = "nan"; Integer.parseInt(givenString); }

7. С Гуава

Разбира се, не е нужно да се придържаме към самата Java. Ето как едно и също нещо може да бъде постигнато с помощта на Ints.tryParse () на Guava , който връща нулева стойност, ако не може да анализира входа:

@Test public void givenString_whenTryParse_shouldConvertToInt() { String givenString = "42"; Integer result = Ints.tryParse(givenString); assertThat(result).isEqualTo(42); }

Освен това методът tryParse () също приема втори аргумент radix , подобен на parseInt () и valueOf ().

8. Заключение

В тази статия разгледахме множество начини за преобразуване на String екземпляри в int или Integer екземпляри.

Всички примери за код могат, разбира се, да бъдат намерени в GitHub.