Рубрики
Без рубрики

Преобразование строки в int или Integer в Java

В этой статье мы покажем несколько способов преобразования строки в int или целое число.

Автор оригинала: baeldung.

1. введение

Преобразование String в int или Integer – очень распространенная операция в Java. В этой статье мы покажем несколько способов решения этой проблемы.

Есть несколько простых способов справиться с этим базовым преобразованием.

2. Integer.parseInt()

Одним из основных решений является использование Integer выделенного статического метода: parseInt() , который возвращает примитивное int значение :

@Test
public void givenString_whenParsingInt_shouldConvertToInt() {
    String givenString = "42";

    int result = Integer.parseInt(givenString);

    assertThat(result).isEqualTo(42);
}

По умолчанию метод parseInt() предполагает, что заданная строка является целым числом base-10. Кроме того, этот метод принимает еще один аргумент для изменения этого значения по умолчанию radix. Например, мы можем разобрать двоичную строку 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() также принимает пользовательский radix в качестве второго аргумента:

@Test
public void givenBinaryString_whenCallingIntegerValueOf_shouldConvertToInt() {
    String givenString = "101010";

    Integer result = Integer.valueOf(givenString, 2);

    assertThat(result).isEqualTo(new Integer(42));
}

3.1. Целочисленный кэш

На первый взгляд может показаться, что значение методов() и parseInt() совершенно одинаковы. По большей части это верно — даже метод valueOf() делегирует метод parseInt внутренне.

Однако есть одно тонкое различие между этими двумя методами: метод valueOf() использует целочисленный кэш внутри . Этот кэш будет возвращать один и тот же Целочисленный экземпляр для чисел от -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, этот конструктор был устарел в пользу других статических заводских методов, таких как value Of() или parseInt() . Даже до этого устаревания было редко уместно использовать этот конструктор. Мы должны использовать parseInt() для преобразования строки в примитив int или использовать valueOf() для преобразования ее в объект Integer .

5. Целое число.декодирование()

Кроме того, Integer.decode() работает аналогично Integer.value(), но также может принимать различные числовые представления :

@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. Вот как то же самое можно сделать с помощью Guava Ints.TryParse(), который возвращает null значение, если он не может разобрать входные данные:

@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 .