🔥 🚀 Важно для всех, кто работает с Java! 🔥
На JavaRocks ты найдешь уникальные туториалы, практические задачи и редкие книги, которых не найти в свободном доступе. Присоединяйся к нашему Telegram-каналу JavaRocks — стань частью профессионального сообщества!
В этой статье мы объясним, как преобразовать long в int в Java и напишем несколько примеров кода. Поскольку long — это больший тип данных, чем int, мы должны использовать приведение типов. Как вы, вероятно, уже знаете, и long , и int в Java являются примитивными типами данных.
Это означает, что они не являются объектами класса. Все объекты и массивы хранятся в куче, в то время как примитивные типы, такие как int и long, хранятся в стековой памяти.
Long и int в чем-то похожи. Integer означает целое число, которое может быть положительным, отрицательным или нулевым. И long , и int являются целочисленными типами, поэтому они в некотором роде совместимы.
Проблема в том, что тип long находится в диапазоне от -9223372036854775808 до 9223372036854775807.
Для типа long выделяется 64 бита.
При этом тип int занимает 32 бита, в которые можно поместить числа от -2147483648 до 2147483647.
Это значит, что любое число типа int легко уместится в тип long . В Java преобразование из более узкого типа в более широкий происходит автоматически. По-другому это называется расширением.
int myInt= 18;
long myLong= 16000;
myLong = myInt;Run CodeЗдесь мы присваиваем переменной типа long значение из переменной типа int . Все пройдет гладко, в большем типе данных спокойно помещается меньший и ничего не теряется, кроме места в памяти :)))). Кстати, когда мы объявляем переменную типа long и определяем ее значение, лучше присвоить ей букву l в конце, это пригодится, когда мы будем работать с числами за пределами диапазона int .
long myVeryLong = 10000000000l;Run CodeПреобразование типа long в int в Java
Теперь вернемся к основной задаче этой статьи — преобразованию long в int. Проблема в том, что что-то большее не всегда помещается во что-то меньшее. Если попытаться действовать как в предыдущем примере, но наоборот:
public static void main(String[] args) {
int myInt= 18;
long myLong= 16000;
myInt = myLong;
}Run CodeКомпилятор Java просто не позволит нам сделать это и выдаст ошибку. Поэтому для этой операции нам нужно использовать приведение типов. Чтобы сузить переменную, вам нужно явно указать тип, к которому вы хотите привести свое значение. Вот пример, в котором мы попытаемся поместить одно «маленькое» число типа long в переменную типа int и два «больших» long числа, которые выходят за пределы диапазона int.
public class longToInt {
public static void main(String[] args) {
int myInt = 18;
long myLong = 16000;
long myVeryLong = 2147483648l;
long myVeryLong = 10000000000l;
myInt = (int) myLong;
System.out.println(myInt);
myInt = (int) oneMoreLong;
System.out.println(myInt);
myInt = (int) myVeryLong;
System.out.println(myInt);
}
}Run CodeМы уведомили компилятор, что хотим поместить long значение в переменную типа int. Компилятор, увидев явное указание на более узкий тип, выполняет преобразование. В результате получаем вывод:
16000
-2147483648
1410065408
Ну, 16000 — это определенно то, что мы ожидали увидеть, но почему минус в -2147483648? И что означает это 1410065408? Дело в том, что такие числа хранились в переменной long , которая, как мы помним, занимает 64 бита. Мы пытаемся поместить эти числа в переменную int , которая может хранить только 32 бита. Как правило, эти 32 ячейки будут содержать нули и единицы из первых 32 бит long числа , а остальные будут просто отброшены. Поэтому, если исходное число не помещается в 32 бита, то те биты, которые не помещаются, просто отбрасываются. Вот почему у нас есть только правильное число 16000, так как оно занимает меньше 32 бит.
Преобразование Java 8 long в int
В Java 8 класс Math имеет новый метод, который преобразует long в int .
Math.toIntExact(value);Run CodeЛучшее в этом методе то, что он контролирует длину преобразованного числа, и если значение слишком велико, чтобы поместиться в int , он выдаст исключение. Давайте посмотрим, как это работает в нашем примере:
public class intToLong {
public static void main(String[] args) {
int myInt = 18;
long myLong = 16000;
long oneMoreLong = 2147483648l;
long myVeryLong = 10000000000l;
System.out.println(Math.toIntExact(myLong));
int y = Math.toIntExact(oneMoreLong);
System.out.println(oneMoreLong);
System.out.println(Math.toIntExact(myVeryLong));
}
}Run CodeВыходные данные:
16000
Exception in thread "main" java.lang.ArithmeticException: integer overflow
at java.base/java.lang.Math.toIntExact(Math.java:1080)
at intToLong.main(intToLong.java:13)
Таким образом, программа вывела единственное правильно преобразованное число 16000, а затем при попытке вставить в int число, выходящее за пределы диапазона 2147483648l , метод выдал исключение. Таким образом, у нас нет проблемы отброшенных битов, как в случае классического преобразования Java long в int .
Использование BigDecimal для преобразования Long в Int
Класс BigDecimal в Java обеспечивает надежный способ обработки больших чисел и гарантирует точность при преобразованиях. Хотя он обычно используется для арифметических операций с числами с плавающей точкой, его также можно использовать для безопасного преобразования long в int.
Пример:
import java.math.BigDecimal;
public class BigDecimalConversion {
public static void main(String[] args) {
long longValue = 9223372036854775807L;
BigDecimal bigDecimal = new BigDecimal(longValue);
int intValue = bigDecimal.intValueExact();
System.out.println("Converted int value: " + intValue);
}
}Run CodeПримечание: Метод intValueExact() выдает исключение, ArithmeticException если long значение превышает диапазон int.
Использование метода Guava saturatedCast
Библиотека Guava от Google предлагает saturatedCast метод, который безопасно преобразует long в int. Этот метод контролирует, что бы значения за пределами диапазона int автоматически корректировались до Integer.MAX_VALUE или Integer.MIN_VALUE, в зависимости от направления переполнения.
Пример:
import com.google.common.primitives.Ints;
public class GuavaConversion {
public static void main(String[] args) {
long longValue = 9223372036854775807L;
int intValue = Ints.saturatedCast(longValue);
System.out.println("Converted int value: " + intValue);
}
}Run CodeСовет: Guava — мощная библиотека, которая упрощает множество задач программирования на Java. Рассмотрите возможность включения ее в свои проекты для улучшения функциональности.
Понимание классов-обёрток для преобразования типов
Классы-обертки предоставляют объектно-ориентированный подход к обработке примитивных типов данных. Классы Long и Integer предлагают методы для упрощения преобразований между long и int.
Основные характеристики классов-обёрток:
- Предоставляют служебные методы для преобразования типов.
- Включают упаковку и распаковку примитивных типов.
- Предлагают такие методы, как
intValue()для простых преобразований.
Использование метода intValue() для преобразования
Метод intValue() класса Long преобразует Long объект в int примитив.
Пример:
public class WrapperClassConversion {
public static void main(String[] args) {
Long longValue = 100000L;
int intValue = longValue.intValue();
System.out.println("Converted int value: " + intValue);
}
}Run CodeВнимание: если Long значение превышает диапазон int, результат будет усечен, что может привести к потере данных.
Перевод статьи «How to Convert Long to Int in Java».
