在Java中,如果某个字段int
已足够,而且出于某种原因我使用long
,那会不会花费更多内存?这种类型会有所不同吗?
答案 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)
答案 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-比特型)。
如果您定位多个系统,则可以使用与最常用的数据类型匹配的数据类型。