Иногда я вижу API с помощью long
или long
или int
или Integer
, и я не могу понять, как принято решение для этого?
Когда я должен выбрать что?
Иногда я вижу API с помощью long
или long
или int
или Integer
, и я не могу понять, как принято решение для этого?
Когда я должен выбрать что?
Long
является формой Object
Long
, а Integer
является объектной формой int
.
Long
использует 64 бит. int
использует 32 бита и поэтому может содержать только цифры до ± 2 миллиардов (-2 31 до +2 31 -1).
Вы должны использовать Long
и int
, за исключением случаев, когда вам нужно использовать методы, унаследованные от Object
, например hashcode
. Java.util.collections
обычно используют вставные версии (Object
-wrapped), потому что они должны работать для любого Object
, а примитивный тип, например int
или Long
, не является Object
.
Другое отличие состоит в том, что Long
и int
являются пропущенными значениями, тогда как Long
и Integer
являются значениями, передаваемыми по ссылке, как и все непримитивные типы Java. Поэтому, если бы можно было изменить a Long
или Integer
(это не так, они неизменяемы без использования кода JNI), есть и другая причина использовать один над другим.
Последнее различие заключается в том, что a Long
или Integer
может быть null
.
Есть несколько вещей, которые вы не можете сделать с примитивным типом:
null
Object
sЕсли вам не нужен какой-либо из них, вы должны предпочесть примитивные типы, поскольку они требуют меньше памяти.
int
, удерживая цифры.int
слишком мал, используйте long
long
слишком мал, используйте BigInteger
Collection
, обработке null
,...) вместо Integer
/long
вместоAn int
- это 32-разрядное целое число; a long
- это 64-разрядное целое число. Какой из них использовать, зависит от того, насколько велики числа, с которыми вы рассчитываете работать.
int
и long
являются примитивными типами, а Integer
и long
являются объектами. Примитивные типы более эффективны, но иногда вам нужно использовать объекты; например, классы коллекции Java могут работать только с объектами, поэтому, если вам нужен список целых чисел, вы должны сделать его List<Integer>
, например (вы не можете использовать int
в List
напрямую).
Int
32 bits (4byte)
-2,147,483,648 to 2,147,483,647
Long
64 bits (8byte)
-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
Если вы используете переменную в 32-битном диапазоне, используйте Int
, иначе используйте long
. Обычно long используется для научных вычислений, и тому подобные вещи требуют большой точности. (например, значение пи).
Примером выбора одного над другим является случай YouTube. Сначала они определили счетчик просмотров видео как
int
который был переполнен при получении более 2 147 483 647 просмотров на популярном видео. Поскольку счетчикInt
не может хранить значения, превышающие его диапазон, YouTube изменил счетчик на 64-битную переменную и теперь может насчитывать до 9 223 372 036 854 775 807 просмотров. Поймите ваши данные и выберите тип, который подходит как 64-битная переменная займет вдвое больше памяти, чем 32-битная переменная.
Когда дело доходит до использования очень длинного числа, которое может превышать 32 бита для представления, вы можете долго использовать, чтобы убедиться, что у вас не будет странного поведения.
Из Java 5 вы можете использовать функции in-boxing и out-boxing, чтобы использовать int и Integer полностью одинаково. Это означает, что вы можете:
int myInt = new Integer(11);
Integer myInt2 = myInt;
Входящий и исходящий бокс позволяют вам переключаться между int и Integer без какого-либо дополнительного преобразования (то же самое для Long
, Double
, Short
)
Вы можете использовать int
все время, но Integer
содержит некоторые вспомогательные методы, которые могут помочь вам выполнить некоторые сложные операции с целыми числами (например, Integer.parseInt(String)
)
а) Класс объекта "Long" по сравнению с примитивным типом "long". (По крайней мере на Java)
б) Существуют разные (даже неясные) размеры памяти примитивных типов:
Java - все ясно: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
C.. просто беспорядок: https://en.wikipedia.org/wiki/C_data_types