Перейти к основному содержимому

Преобразование строки в целое или целое число в Java

· 3 мин. чтения

1. Введение

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

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

2. Целое.parseInt()

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

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

int result = Integer.parseInt(givenString);

assertThat(result).isEqualTo(42);
}

По умолчанию метод parseInt() предполагает, что данная строка является целым числом с основанием 10. Кроме того, этот метод принимает еще один аргумент для изменения системы счисления по умолчанию. Например, мы можем разобрать бинарные String следующим образом:

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

int result = Integer.parseInt(givenString, 2);

assertThat(result).isEqualTo(42);
}

Естественно, этот метод также можно использовать с любой другой системой счисления, такой как 16 (шестнадцатеричная) или 8 (восьмеричная).

3. Целое.значениеOf()

Другой вариант — использовать статический метод 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. Целое.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 при обнаружении неожиданных значений 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() также принимает второй аргумент системы счисления , аналогичный parseInt() и valueOf().

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

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

Все примеры кода, конечно же, можно найти на GitHub .