Long vs Integer, long vs int, что использовать и когда?

135

Иногда я вижу использование API longили Longили intили Integer, и я не могу понять, как решение для этого принято?

Когда я должен выбрать что?

Я знаю, как поставить галочку
источник

Ответы:

191

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. Так что если бы можно было изменить LongилиInteger (это не так, они неизменны без использования кода JNI), была бы другая причина использовать один поверх другого.

Последнее различие заключается в том, что Longили Integerможет быть null.

Borealid
источник
5
@Borealid, это так неправильно, Java всегда передается по значению, в Java нет ничего такого, как передача по ссылке.
Диего Рамос
9
Ага? Хорошо, давайте рассмотрим идею, что Java никогда не передает ссылку. Если я вызову функцию, передающую ей int [2], а затем внутри функции я изменю значение, содержащееся в первом элементе этого массива, увидит ли вызывающая функция это изменение? Да? Ну, это потому, что то, что было передано функции, было не значениями в массиве, а ссылкой на эти значения. «Передача по значению» означает, что сами данные копируются без каких-либо косвенных изменений. Кто бы вас ни учил, что Java передается по значению, вы оказали плохую услугу.
Бореалид
3
@Borealid вы неверны, значение изменилось, потому что была создана новая копия ссылки на массив, поэтому, кто бы ни вызывал функцию, увидит изменение, это все равно передается по значению. Я не могу поверить, что вы говорите, что есть передача по ссылке в Java. Вы никогда не передадите оригинальную ссылку на функцию.
Диего Рамос
6
В теоретическом мире, где Java вела себя совершенно иначе, чем в действительности, и передача объекта или массива в функцию приводила к совершенно отдельной копии (где изменения внутри функции вообще не отражались для вызывающих), как бы вы тогда описать язык? Помня о том, что мы говорим совсем не о том, что на самом деле делает Java.
Бореалид
2
@DiegoRamos прав. Java всегда передается по значению, путаница создается из-за того, что значение, когда не примитив является ссылкой на память, статический обмен не работает в Java, подробнее здесь: journaldev.com/3884/…
Panthro
28

Есть пара вещей, которые вы не можете сделать с примитивным типом:

  • Иметь nullзначение
  • синхронизировать на них
  • Используйте их в качестве параметра типа для универсального класса и связанного с этим:
  • Передайте их в API , который работает с Objectс

Если вам не нужен ни один из них, вы должны предпочитать примитивные типы, так как они требуют меньше памяти.

Майкл Боргвардт
источник
24
  • По умолчанию используйте int, когда держите числа.
  • Если диапазон intслишком мал, используйтеlong
  • Если диапазон longслишком мал, используйтеBigInteger
  • Если вам нужно обрабатывать ваши числа как объект (например, когда вы помещаете их в Collection, обработку null, ...), используйте Integer/ Longвместо
Йоахим Зауэр
источник
13

An intявляется 32-битным целым числом; а longявляется 64-битным целым числом. Какой из них использовать, зависит от того, с какими числами вы ожидаете работать.

intи longявляются примитивными типами, а Integerи Longявляются объектами. Примитивные типы более эффективны, но иногда вам нужно использовать объекты; Например, классы коллекции Java могут работать только с объектами, поэтому, если вам нужен список целых чисел, вы должны List<Integer>, например, сделать его (вы не можете использовать intего Listнапрямую).

Jesper
источник
6

целое число - это 32-разрядное целое число со знаком

  • Обозначается как Int
  • Размер = 32 bits (4byte)
  • Может содержать целые числа диапазона -2,147,483,648 to 2,147,483,647
  • значение по умолчанию 0


Long - это 64-битное целое число со знаком

  • Обозначается как Long
  • Размер = 64 bits (8byte)
  • Может содержать целые числа диапазона -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • значение по умолчанию 0L


Если ваше использование переменной попадает в 32-битный диапазон, используйте Int, иначе используйте long. Обычно long используется для научных вычислений, и тому подобные вещи требуют большой точности. (например, значение пи).

Примером выбора одного над другим является случай YouTube. Сначала они определили счетчик просмотров видео как intпереполненный при просмотре более 2 147 483 647 просмотров популярного видео. Поскольку Intсчетчик не может хранить значения, превышающие его диапазон, YouTube изменил счетчик на 64-битную переменную и теперь может насчитывать до 9 223 372 036 854 775 807 просмотров. Поймите ваши данные и выберите тип, который подходит как 64-битная переменная займет вдвое больше памяти, чем 32-битная переменная.

Все это Ваити
источник
1

Когда дело доходит до использования очень длинного числа, которое может превышать 32 бита для представления, вы можете использовать long, чтобы убедиться, что у вас не будет странного поведения.

В Java 5 вы можете использовать функции in-boxing и out-boxing, чтобы полностью использовать int и Integer. Это означает, что вы можете сделать:

int myInt = new Integer(11);
Integer myInt2 = myInt;

И из бокса позволяют переключаться между междунар и Integer без дополнительной конвертации ( то же самое для Long, Double, Shortтоже)

Вы можете использовать intвсе время, но Integerсодержит некоторые вспомогательные методы, которые могут помочь вам выполнить некоторые сложные операции с целыми числами (такими как Integer.parseInt(String))

Хоусем Берраяна
источник
0

а) Класс объекта "Long" против примитивного типа "long". (По крайней мере на Java)

б) Существуют разные (даже неясные) размеры памяти примитивных типов:

Java - все ясно: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  • байт, символ .. 1B .. 8b
  • короткая инт .. 2б .. 16б
  • int .. .. .. .. 4B .. 32b
  • длинный инт .. 8б .. 64б

C .. просто беспорядок: https://en.wikipedia.org/wiki/C_data_types

  • коротко .. 16б
  • int .. .. .. 16b ... wtf?!?!
  • долго .. .. 32б
  • долго долго .. 64б .. беспорядок! : - /
Franta
источник
Это не отвечает на вопрос о разнице между длинным и длинным и т. Д.
GreenAsJade
Нет, он не дает на это явного ответа, не говоря явно о разнице между типами примитивов и объектами типов данных, на самом деле @GreenAsJade, потому что в приведенном выше вопросе не говорится о каком-либо конкретном языке. Поэтому я дал сравнение - чтобы каждый мог проверить разницу. (из достоверных данных, при условии)
Franta
На вопрос поставлен Java.
GreenAsJade