Long vs Integer,long vs int,啥时候使用?
Posted
技术标签:
【中文标题】Long vs Integer,long vs int,啥时候使用?【英文标题】:Long vs Integer, long vs int, what to use and when?Long vs Integer,long vs int,什么时候使用? 【发布时间】:2011-08-17 00:00:49 【问题描述】:有时我看到 API 使用 long
或 Long
或 int
或 Integer
,我不知道是如何做出决定的?
我应该什么时候选择?
【问题讨论】:
【参考方案1】:Long
是long
的Object
形式,Integer
是int
的对象形式。
long
使用 64 bits。 int
使用 32 位,因此最多只能保存 ±20 亿的数字(-231 到 +231-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,这是大错特错了,Java总是传值,Java中没有传引用之类的东西。 嗯嗯?好的,让我们探讨一下 Java 从不传递引用的想法。如果我调用一个函数,给它一个 int[2],然后在函数内部更改该数组的第一个元素中保存的值,函数的调用者会看到这种变化吗?是的?那是因为传递给函数的不是数组中的值,而是对这些值的引用。 “按值传递”意味着实际数据本身正在被复制而没有间接性。谁教你 Java 是按值传递的,这对你造成了伤害。 @Borealid 你错了,值改变是因为创建了对数组的引用的新副本,这就是为什么调用函数的人都会看到改变,这仍然是按值传递.我不敢相信你说 Java 中有引用传递。您永远不会将原始引用传递给函数。 在理论上,Java 的行为与实际行为完全不同,将对象或数组传递给函数会产生完全独立的副本(其中函数内部的修改不会反映给调用者完全),那么您将如何描述该语言?请记住,我们所说的完全不是 Java 实际所做的。 @DiegoRamos 是对的。 Java 总是按值传递,造成混淆是因为非原始时的值是内存引用,静态交换在 java 中不起作用,更多细节在这里:journaldev.com/3884/…【参考方案2】:有几件事你不能用原始类型做:
有一个null
值
在它们上同步
将它们用作泛型类的类型参数,并与之相关:
将它们传递给与Object
s 配合使用的 API
除非您需要其中任何一种,否则您应该更喜欢原始类型,因为它们需要更少的内存。
【讨论】:
【参考方案3】: 默认使用int
,当持有号码时。
如果int
的范围太小,请使用long
如果long
的范围太小,使用BigInteger
如果您需要将数字作为对象处理(例如,将它们放入 Collection
,处理 null
,...)请改用 Integer
/Long
【讨论】:
【参考方案4】:int
是一个 32 位整数; long
是一个 64 位整数。使用哪一个取决于您希望使用的数字有多大。
int
和 long
是原始类型,而 Integer
和 Long
是对象。原始类型效率更高,但有时需要使用对象;例如,Java 的集合类只能与对象一起使用,因此如果您需要整数列表,则必须将其设为 List<Integer>
,例如(您不能在 List
中直接使用 int
)。
【讨论】:
【参考方案5】:当涉及到使用可能超过 32 位的非常长的数字来表示时,您可以使用 long 来确保您不会出现奇怪的行为。
从 Java 5 开始,您可以使用 in-boxing 和 out-boxing 功能使 int 和 Integer 的使用完全一样。这意味着你可以这样做:
int myInt = new Integer(11);
Integer myInt2 = myInt;
in 和 out boxing 允许您在 int 和 Integer 之间切换而无需任何额外的转换(Long
,Double
,Short
也一样)
你可以一直使用int
,但Integer
包含一些辅助方法,可以帮助你对整数进行一些复杂的操作(例如Integer.parseInt(String)
)
【讨论】:
【参考方案6】:a) 对象类“Long”与原始类型“long”。 (至少在 Java 中)
b) 原始类型的内存大小不同(甚至不清楚):
Java - 一切正常:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
字节、字符 .. 1B .. 8b 短整数 .. 2B .. 16b int .. .. .. .. 4B .. 32b long int .. 8B .. 64bC .. 只是一团糟:https://en.wikipedia.org/wiki/C_data_types
短.. .. 16b int .. .. .. 16b ... wtf?!?! 长.. .. 32b 长长.. 64b .. 乱七八糟! :-/【讨论】:
这并没有回答问题,这是关于 Long 和 long 等之间的区别。 不,它没有明确回答它,没有明确说明原始类型与数据类型对象之间的区别,实际上是@GreenAsJade,因为上面的问题没有说明任何特定的语言。所以我提供了一个比较 - 所以每个人都可以检查差异。 (根据提供的硬数据) 问题说明了Java。【参考方案7】:整数是有符号的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 用于科学计算,类似的东西需要很高的准确性。 (例如 pi 的值)。
YouTube 的例子就是一个选择一个而不是另一个的例子。他们首先将视频观看计数器定义为
int
,当一个热门视频的观看次数超过 2,147,483,647 次时,该计数器就会溢出。由于Int
计数器不能存储超过其范围的任何值,YouTube 将计数器更改为 64 位变量,现在最多可以计算 9,223,372,036,854,775,807 次观看。了解您的数据并选择适合的类型,因为 64 位变量将比 32 位变量占用两倍的内存。
【讨论】:
以上是关于Long vs Integer,long vs int,啥时候使用?的主要内容,如果未能解决你的问题,请参考以下文章
OSX vs Linux:如何处理 unsigned long 和 uint64_t?