在Java中声明'long'超过'int'

时间:2009-10-08 18:07:24

标签: java

在Java中,如果某个字段int已足够,而且出于某种原因我使用long,那会不会花费更多内存?这种类型会有所不同吗?

7 个答案:

答案 0 :(得分:7)

在Java中,是的,long是8字节宽,整数是4字节宽。 This Java tutorial goes over the primitive data types.如果将分配数乘以一定数量(例如,如果您分配了500万个这些变量),则差异可以忽略不计。然而,对于平均使用量而言,这并不重要。

(无论如何,你已经在使用Java了,记忆就是这样的。)

在母语中,有性能考虑因素; 32位值可以保存在32位体系结构的单个寄存器中,但不能保存在64位值中;在64位架构上,很明显,它可以。我不确定Java在其原生整数上做了什么样的优化,但在运行时也可能如此。还有一些令人担忧的对齐问题 - 不过你会看到使用短路和字节的更多信息。

最佳做法是使用您需要的类型。如果该值永远不会超过2 ^ 31,请不要使用long。

答案 1 :(得分:3)

假设您之前的问题是在Java范围内提出这个问题,那么int数据类型是4个字节,长数据类型是8个字节。

但是,大小差异实际上是否意味着内存使用量的差异取决于具体情况。

如果它是局部变量,则在堆栈上分配。由于堆栈已经分配,​​使用更多堆栈空间将不会使用更多内存,前提是您不会耗尽堆栈。

如果它是类的成员,则取决于成员的对齐方式。有时成员不会紧凑地堆叠在内存中,但使用填充以便某些成员从偶数地址开始。例如,如果你在一个类中有一个字节和一个int,它们之间可能会有三个字节的填充,以便int从下一个可被4整除的地址开始。

答案 2 :(得分:2)

int为32位,long为64位。 long需要两倍的内存(对于大多数应用程序而言,这是非常微不足道的)。

答案 3 :(得分:2)

Java中的长度是64位,而int是32位,所以很明显长时间使用更多的内存(8个字节而不是4个字节)。

答案 4 :(得分:1)

ifwdev猜错了。 Java将int定义为32位有符号整数,将long定义为64位有符号整数。如果将变量声明为long,那么是,它将占用与声明为int的同一变量相同的内存的两倍。通常,int通常是“默认”数字类型,即使对于可能包含在较小类型(如short中的值)也是如此。除非您有特殊原因要求值大于2^31-1,否则请使用int

答案 5 :(得分:1)

  

...这会花费我更多的记忆吗?

你将使用两次内存

在担心您是否使用更多内存之前,您应该进行分析。

要使用long而不是int使用 1兆字节额外的ram,您必须声明: 262,144 长变量(或在程序中间接使用它们)。< / p>

因此,如果由于某种原因你在使用int时声明了一个或两个长变量,那么你将使用4或8个字节的内存。不用太担心(我的意思是,你的应用程序可能存在最严重的内存问题)

取自Java Tutorial这里的int和long

的定义
  

int :int数据类型是32位带符号的二进制补码整数。它的最小值为-2,147,483,648,最大值为2,147,483,647(含)。对于整数值,此数据类型通常是默认选择,除非有理由(如上所述)选择其他内容。此数据类型很可能足以容纳您的程序将使用的数字,但如果您需要更宽范围的值,请使用long。

     

long :长数据类型是64位带符号的二进制补码整数。它的最小值为-9,223,372,036,854,775,808,最大值为9,223,372,036,854,775,807(含)。当您需要的值范围比int提供的值宽时,请使用此数据类型。

但请记住:根据Donald Knuth的说法"Premature optimization is the root of all evil"(根据我的说法,复制/粘贴是所有邪恶的根源)

答案 6 :(得分:0)

如果您知道您的数据适合特定数据类型(例如C中的short int),那么使用更大数据的唯一原因是性能正确吗?如果这是你的目标,无论你的性能获得多么微不足道,作为一般的经验法则,你想要使用与你的架构大小相匹配的大小(因此对于普通的32位目标系统,你要使用32-比特型)。

如果您定位多个系统,则可以使用与最常用的数据类型匹配的数据类型。