Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java是否在任何地方定义了其基本类型的大小?_Java_Primitive_Primitive Types - Fatal编程技术网

Java是否在任何地方定义了其基本类型的大小?

Java是否在任何地方定义了其基本类型的大小?,java,primitive,primitive-types,Java,Primitive,Primitive Types,是否有一个包定义我可以在项目中导入的Java原语的大小?我正在进行一些手动位设置,并保留一个字节索引。我不想在设置int时执行currentByte+=4(不赞成使用幻数),而是执行currentByte+=.SIZE\u OF\u int 我想我可以定义自己的,但这有点笨重,特别是如果在某处可以找到这些类。不是类,但是您有整数.SIZE,等等,对于长类和浮点类也是如此。您还有*.BYTES 因此Integer.SIZE为32,Integer.BYTES为4,Double.SIZE为64,Dou

是否有一个包定义我可以在项目中导入的Java原语的大小?我正在进行一些手动位设置,并保留一个字节索引。我不想在设置int时执行
currentByte+=4
(不赞成使用幻数),而是执行
currentByte+=.SIZE\u OF\u int


我想我可以定义自己的,但这有点笨重,特别是如果在某处可以找到这些类。

不是类,但是您有
整数.SIZE
,等等,对于
长类和浮点类也是如此。您还有
*.BYTES

因此
Integer.SIZE
为32,
Integer.BYTES
为4,
Double.SIZE
为64,
Double.BYTES
为8,以此类推;所有这些都是
int
s,以防您感到奇怪

注意:
*.BYTES
仅在Java8之后定义(感谢@Slanec的注意)

*.SIZE
出现在Java5中,但您至少使用了它,对吗?)


是的,这是由JDK定义的,因为JLS本身定义了原语类型的大小;因此,我们保证在任何平台上的任何Java实现上,这些常量的值都是相同的。

原语大小的规范包含在Java语言规范中

整数类型为byte、short、int和long,其值分别为8位、16位、32位和64位有符号二位补码整数,以及char,其值为16位无符号整数,表示UTF-16代码单位(§3.1)


这是标准,不会更改,因此不需要在中导入它们。您可以将它们用作幻数(尽管正如所指出的,这些幻数存储在自Java 5以来的各种包装类的合理位置,您应该使用它们,而不是自己重新定义它们)。

如果您使用的是
currentByte
,那么您可能可以使用更好的数据结构,例如缓冲区。由于进程原因,我正试图将更改保持在最小值,但我会考虑一下。请注意,如果处理固定字节操作,我会非常倾向于使用
byte[]
。如果您深入了解位级操作,您可能会发现BigInteger很有用,因为它还有testBit和setBit方法(以及其他位级方法)。。。然后你就不在乎它的大小了,原来就是这么用的。我最终改用了ByteBuffer,它更干净,并负责所有的索引。Java SE 7是我的目标发行版。@ventsyv那么你至少有
*。SIZE
@shookes这些值的任何更改都会破坏所有类文件及其前后兼容性。与“您的代码不再工作”相比,“您的代码不再工作”将是一个小问题。我不相信这些会改变并保持不变。鉴于
Integer.SIZE
是一个静态的最终值,并且在编译时被替换,使用Integer中的值,如果它要更改,对于它在更高版本中的更改同样是一个突破性的更改。@Shookes虽然我完全同意标准的更改,我很乐意称之为通常不会改变的事情。甲骨文是Java的幕后推手,甲骨文并不是那种能够改变这种情况的公司。从类似公司和财团的标准来看,这是他们为了避免改变而会向后弯曲的细节。如果语言规范变得足够紧张,导致Oracle改变这一点,我有一种感觉,那就是会有太多其他问题,大小将是您最不担心的。Java代码有没有办法区分原语具有指定大小的实现和所有原语占用13字节空间的实现,任何基元类型的数组每个元素占用13字节?人们期望内存只容纳比
byte[1000000]
实例多八分之一的
long[1000000]
实例,但由于在这两种情况下都没有指定适合内存的实例数量,我认为这不会是一个“可观察到的”差异。顺便说一句,使用魔法数字的问题不在于它们可能会改变,而在于它们对观看它们的人来说似乎很神奇。一蒲式耳可能总是9.6美制加仑,但当我阅读您的代码时,这并不会使它变得更容易。