我引用Herbert Schildt的第3章数据类型,变量和数组:
基元类型表示单个值而不是复杂对象。 虽然Java完全是面向对象的,但原始的 类型不是。这种效率的原因。制作原始 类型会使性能降低太多。
原始类型被定义为具有明确的范围和 数学行为。 C,C ++等语言允许的大小 整数根据执行环境的指示而变化。 但是,Java是不同的。由于Java的可移植性要求, 所有数据类型都有一个强烈定义的范围。例如,int是 无论特定平台如何,总是32位。这允许 要编写的程序,保证在不移植的情况下运行 任何机器架构。同时严格指定一个的大小 在某些环境中,整数可能会导致性能的轻微损失 为了实现便携性是必要的。
最后两行是什么意思?如何指定整数的大小可能会导致某些环境中的性能损失很小?
答案 0 :(得分:8)
In" lower"语言,原始数据类型大小通常来自CPU处理它们的能力。
例如,在c中,int
被定义为"大小至少为16位",但其大小可能因架构而异,以确保" type int应该是目标处理器最有效的整数类型。" (source)。这意味着,如果您的代码对int
的大小做了粗心的假设,那么如果您将其从32位x86移植到64位powerpc,则可能会中断
java是不同的。例如,int
将始终为32位。这意味着当您在不同的体系结构上运行相同的代码时,不必担心其大小会发生变化。如上所述,权衡是性能 - 在任何本身不处理32位计算的架构上,这些int
需要扩展到CPU可以处理的本机大小(将具有(如果CPU只能处理较小的int
s,int
上的每个操作都可能需要多次CPU操作。
答案 1 :(得分:3)
一些(极少数)computers use 36 bit architecture,因此您需要额外的步骤来屏蔽掉位,模拟溢出等。
答案 2 :(得分:2)
AFAIK,java中没有办法定义整数的大小。它总是一个32位的int mentioned。但是一些编程语言可能允许指定整数的大小(例如:Ada)。
编译器尝试将代码转换为machine code instructions
时会出现性能问题(请参阅here和here)。通常机器代码指令是32位或64位。如果我们的int与机器代码中的大小相同,则很容易将它们转换为机器代码。否则编译器需要付出额外的努力将它们转换为机器代码。当性能问题出现时。
答案 3 :(得分:2)
Java在底层系统的指针机制的顶部实现了自己的数据指针机制。如果数据不够大,许多系统可能会使用较小的指针。
对于ex:如果整数数据只需要16位指针,系统将仅分配使用16位指针所需的存储空间。但是如果你使用Java,它会将16位转换为32位指针分配,这需要大的内存空间,这也会降低 storage 和 <的性能em>数据搜索 。因为你的指针是大。