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 使用 longLongintInteger,我不知道是如何做出决定的?

我应该什么时候选择?

【问题讨论】:

【参考方案1】:

LonglongObject形式,Integerint的对象形式。

long 使用 64 bits。 int 使用 32 位,因此最多只能保存 ±20 亿的数字(-231 到 +231-1)。

您应该使用longint,除非您需要使用从Object 继承的方法,例如hashcodeJava.util.collections 方法通常使用盒装 (Object-wrapped) 版本,因为它们需要适用于任何 Object,并且像 intlong 这样的原始类型不是 Object

另一个区别是longint按值传递,而LongInteger按参考值传递 ,就像所有非原始 Java 类型一样。因此,如果可以修改 LongInteger(不是,它们在不使用 JNI 代码的情况下是不可变的),那么还有另一个理由使用其中一个。

最后一个区别是LongInteger 可以是null

【讨论】:

@Borealid,这是大错特错了,Java总是传值,Java中没有传引用之类的东西。 嗯嗯?好的,让我们探讨一下 Java 从不传递引用的想法。如果我调用一个函数,给它一个 int[2],然后在函数内部更改该数组的第一个元素中保存的值,函数的调用者会看到这种变化吗?是的?那是因为传递给函数的不是数组中的值,而是对这些值的引用。 “按值传递”意味着实际数据本身正在被复制而没有间接性。谁教你 Java 是按值传递的,这对你造成了伤害。 @Borealid 你错了,值改变是因为创建了对数组的引用的新副本,这就是为什么调用函数的人都会看到改变,这仍然是按值传递.我不敢相信你说 Java 中有引用传递。您永远不会将原始引用传递给函数。 在理论上,Java 的行为与实际行为完全不同,将对象或数组传递给函数会产生完全独立的副本(其中函数内部的修改不会反映给调用者完全),那么您将如何描述该语言?请记住,我们所说的完全不是 Java 实际所做的。 @DiegoRamos 是对的。 Java 总是按值传递,造成混淆是因为非原始时的值是内存引用,静态交换在 java 中不起作用,更多细节在这里:journaldev.com/3884/…【参考方案2】:

有几件事你不能用原始类型做:

有一个null 值 在它们上同步 将它们用作泛型类的类型参数,并与之相关: 将它们传递给与Objects 配合使用的 API

除非您需要其中任何一种,否则您应该更喜欢原始类型,因为它们需要更少的内存。

【讨论】:

【参考方案3】: 默认使用int,当持有号码时。 如果int 的范围太小,请使用long 如果long的范围太小,使用BigInteger 如果您需要将数字作为对象处理(例如,将它们放入 Collection,处理 null,...)请改用 Integer/Long

【讨论】:

【参考方案4】:

int 是一个 32 位整数; long 是一个 64 位整数。使用哪一个取决于您希望使用的数字有多大。

intlong 是原始类型,而 IntegerLong 是对象。原始类型效率更高,但有时需要使用对象;例如,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 .. 64b

C .. 只是一团糟: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,啥时候使用?的主要内容,如果未能解决你的问题,请参考以下文章

64位机器中的C++ int vs long long

OSX vs Linux:如何处理 unsigned long 和 uint64_t?

Java中怎么将Long类型转换成Integer或int类型?

关于long的争议和思考

如果索引范围为long,则迭代数组

Java中long(Long)与int(Integer)之间的转换(转)