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 .