长整型 vs 整型,long vs int,什么时候使用哪个?

174
有时我会看到API使用longLongintInteger,但我不知道该如何做出决策?
什么情况下应该选择哪个?
7个回答

228

Longlong 的对象形式,而 Integerint 的对象形式。

long 使用 64 位。而 int 只使用 32 位,因此只能容纳 ±20亿范围内的数字(-231 到 +231-1)。

通常情况下应该使用 longint,除非需要使用从 Object 继承来的方法,例如 hashcodeJava.util.collections 方法通常使用包装成对象的版本(即 Object 包装的版本),因为它们需要适用于任何 Object,而基本类型,如 intlong,不是一个 Object

另一个区别是,longint 是按值传递,而 LongInteger 是按引用值传递,就像所有非基本的 Java 类型一样。因此,如果有可能修改一个 LongInteger(实际上是不可能的,除非使用 JNI 代码),那么使用其中一个而不是另一个也将有另一个原因。

最后一个区别是,LongInteger 可能为 null


10
@Borealid,这是错误的,Java始终是按值传递,Java中不存在所谓的按引用传递。 - Diego Ramos
16
嗯?好的,让我们探讨Java从未传递引用的想法。如果我调用一个函数并给它一个int[2],然后在函数内部我改变了该数组第一个元素中保存的值,那么函数的调用者会看到这个改变吗?是的?那是因为传递给函数的不是数组中的值,而是对这些值的引用。 "按值传递"意味着实际的数据本身被复制并传递,没有间接引用。曾经教过你Java是按值传递的人误导了你。 - Borealid
8
@Borealid,你的说法是不正确的。值的改变是因为创建了一个指向数组的新引用副本,这就是为什么调用该函数的人会看到更改,但这仍然是按值传递。我无法相信你会说Java中有按引用传递。你从未将原始引用传递给函数。 - Diego Ramos
7
如果Java在理论世界中的行为方式完全不同于实际情况,即将对象或数组传递给函数会导致完全独立的副本(函数内部的修改不会反映到调用者),那么你会如何描述这种语言?请注意,我们谈论的内容与Java实际执行的操作完全不同。 - Borealid
8
@DiegoRamos是正确的。Java始终按值传递,混淆是因为非原始类型的值是内存引用,静态交换在Java中不起作用,详情请参见此处:https://www.journaldev.com/3884/java-is-pass-by-value-and-not-pass-by-reference - Panthro
显示剩余16条评论

34
  • 默认情况下,当存储数字时,请使用int
  • 如果int的范围过小,则使用long
  • 如果long的范围太小,则使用BigInteger
  • 如果您需要将数字作为对象处理(例如将它们放入Collection中,处理null等),请改用Integer/Long

32

原始类型有一些限制:

  • 不能具有 null
  • 不能在其上进行同步操作
  • 不能将其用作泛型类的类型参数,与此相关的是:
  • 不能将其传递给处理 Object 的 API

除非需要上述功能之一,否则应优先选择原始类型,因为它们需要更少的内存。


19

整数是一个带符号的32位整数类型

  • 表示为Int
  • 大小为32位(4字节)
  • 可以容纳-2,147,483,648至2,147,483,647范围内的整数
  • 默认值是0

### **长整型**是带符号的64位整数类型
  • 表示为Long
  • 大小为64位(8字节)
  • 可以容纳-9,223,372,036,854,775,808至9,223,372,036,854,775,807范围内的整数
  • 默认值是0L

如果你的变量在32位范围内使用,请使用`Int`,否则请使用`long`。通常情况下,长整型用于需要更高精度的科学计算和类似需要更高精度的东西(例如圆周率的值)。

选择其中之一的一个例子是YouTube的案例。他们最初将视频观看计数器定义为一个int,当一个流行视频获得超过2,147,483,647个观看时,它就会溢出。由于Int计数器无法存储超过其范围的任何值,YouTube将计数器更改为64位变量,现在可以计算高达9,223,372,036,854,775,807次观看。了解你的数据并选择适合的类型,因为 64位变量将占用双倍的内存 比32位变量。


使用“Youtube观看次数”示例进行了很好的解释。 - Gray Programmerz

15

int是32位整数;long是64位整数。选用哪一个取决于您预计要处理的数字有多大。

intlong是原始数据类型,而IntegerLong是对象。原始数据类型更有效率,但有时需要使用对象;例如,Java的集合类只能使用对象,所以如果您需要整数列表,则必须将其设置为List<Integer>,例如(不能直接在List中使用int)。


2

当需要使用超过32位的非常长的数字时,您可以使用long来确保不会出现奇怪的行为。

从Java 5开始,您可以使用装箱和拆箱功能使int和Integer的使用完全相同。这意味着您可以执行以下操作:

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

内部装箱和拆箱允许您在int和Integer之间进行切换,无需任何额外的转换(对于LongDoubleShort也是如此)

您可以始终使用int,但Integer包含一些帮助您执行一些复杂操作的辅助方法(例如Integer.parseInt(String)


0

这并没有回答问题,问题是关于Long和long等之间的区别。 - GreenAsJade
不,它并没有明确回答这个问题,也没有明确说明原始类型与数据类型对象之间的区别,事实上@GreenAsJade,因为上面的问题没有指定任何特定的语言。所以我提供了一个比较 - 这样每个人都可以检查差异。(从提供的硬数据中) - Franta
问题中提到了Java。 - GreenAsJade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接