Java 宣布';长';超过';int';在爪哇
在Java中,如果Java 宣布';长';超过';int';在爪哇,java,Java,在Java中,如果int对于一个字段来说足够了,并且如果出于某种原因使用long,这会占用我更多的内存吗?类型不同吗?int是32位,而long是64位long占用的内存是原来的两倍(对于大多数应用程序来说,这是微不足道的) 在Java中,long是64位的,int是32位的,因此显然long使用了更多的内存(8字节而不是4字节)。在Java中,long是8字节宽,整数是4字节宽。如果你将分配的数量乘以一定的数量(比如说,如果你分配了500万个这些变量),那么差异将变得可以忽略不计。然而,对于平
int
对于一个字段来说足够了,并且如果出于某种原因使用long
,这会占用我更多的内存吗?类型不同吗?int
是32位,而long
是64位long
占用的内存是原来的两倍(对于大多数应用程序来说,这是微不足道的) 在Java中,long是64位的,int是32位的,因此显然long使用了更多的内存(8字节而不是4字节)。在Java中,long是8字节宽,整数是4字节宽。如果你将分配的数量乘以一定的数量(比如说,如果你分配了500万个这些变量),那么差异将变得可以忽略不计。然而,对于平均使用率来说,这并不重要
(你已经在使用Java了,不管怎么说,内存到处都是。)
在母语中,需要考虑性能;32位值可以保存在32位体系结构的单个寄存器中,但不能保存在64位值中;显然,在64位体系结构上,它可以。我不确定Java对其本机整数做了什么样的优化,但在其运行时也可能是这样。还有一些对齐问题需要担心——不过,在使用短字符和字节时,您会看到更多这方面的问题
最佳做法是使用您需要的类型。如果该值永远不会超过2^31,则不要使用长的。根据前面的问题,假设您想在Java范围内问这个问题,int数据类型为4字节,long数据类型为8字节 然而,大小的差异是否意味着内存使用的差异取决于具体情况 如果是局部变量,则在堆栈上分配。由于堆栈已经分配,使用更多的堆栈空间不会使用更多的内存,当然前提是不耗尽堆栈
如果它是类的成员,则取决于成员的对齐方式。有时,内存中的成员并没有紧凑地堆叠,但使用了填充,以便某些成员从偶数地址开始。例如,如果一个类中有一个字节和一个int,那么它们之间可能会有三个字节的填充,以便int从下一个可被4整除的地址开始。ifwdev猜对了。Java将
int
定义为32位有符号整数,long
定义为64位有符号整数。如果将变量声明为long
,那么是的,它将占用与声明为int
的同一变量两倍的内存。一般来说,int
通常是“默认”数字类型,即使对于可以包含在较小类型(如short
)中的值也是如此。除非您有特定的理由要求值大于2^31-1
,否则请使用int
如果您知道您的数据将适合特定的数据类型(例如C中的short int int
),使用更大的值的唯一理由是性能对吗?如果这是您的目标,不管您的性能增益有多小,一般来说,您希望使用与架构大小匹配的大小(因此对于普通32位目标系统,您将使用32位类型)
如果针对多个系统,则可以使用与最常用的数据类型匹配的数据类型
…那会让我损失更多的记忆吗
您将使用两倍的内存
在担心是否使用了更多内存之前,应该先分析一下
要使用long而不是int来使用额外的内存1MB,您必须声明:262144long变量(或在程序中间接使用它们)
因此,如果出于某种原因,在应该使用int时声明一个或两个长变量,那么将多使用4或8字节的内存。不用太担心(我的意思是,你的应用程序中可能存在最严重的内存问题)
这是int和long的定义
int:int数据类型是一个32位有符号2的补码整数。它的最小值为-2147483648,最大值为2147483647(含)。对于整数值,此数据类型通常是默认选择,除非有理由(如上所述)选择其他数据类型。此数据类型很可能足够大,足以容纳程序将使用的数字,但如果需要更大范围的值,请使用long
long:long数据类型是一个64位有符号2的补码整数。其最小值为-9223372036854775808,最大值为9223372036854775807(含)。当需要比int提供的值更宽的值范围时,请使用此数据类型
但请记住:根据Donald Knuth的说法(我认为复制/粘贴是万恶之源)用什么语言,在什么平台上?这是相当模糊的,答案将取决于编译器和平台(如果你问我认为你是什么)。对不起,我忘了添加语言。这是一个非常模糊的问题。如果不知道平台和语言,很难回答。在大多数情况下,内存中的微小差异会被更快的CPU操作所抵消。另外值得注意的是,由于long在Java中是64位的,在32位机器上,它将被分配到两个操作中——可能是感兴趣的,也可能不是在MS C/C++编译器中,long和int的大小相同。这取决于语言编译器和平台。java和C都将始终是32和64。是的,我删除了我的-1和以前的注释。int是32位,long是64位,但这并不一定意味着由于对齐和填充问题,long占用的内存是其他语言的两倍。我很确定,速度的问题同样适用于java,就像它适用于本地语言一样。我也是。只是不确定而已。