Java中八种基本类型数据占据内存的大小

最近看 《java核心技术》的时候,有看到一些关于 java 的基础知识,感觉自己对于 java 的一些基础知识还不太了解,在此做一些记录

Java中八种基本类型占用内存的大小

Java 中主要有八种基本类型,其中有4种整型,2种浮点类型,1种用于表示 Unicode 编码的字符类型,一种用于表示真值的类型

整型

  • int:占用 4 字节,取值范围为 -2 147 483 648 ~ 2 147 483 647
  • short:占用 2 字节,取值范围为 -32 768 ~ 32 767
  • long:占用 8 字节,取值范围为 -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807
  • byte:占用 1 字节,取值范围为 -128 ~ 127

浮点类型

  • float:占用 4 字节,取值范围约为 正负3.402 823 47E+38F (有效位数为 6 ~ 7 位)
  • double:占用 8 字节,取值范围约为 正负1.797 693 134 862 315 70E+308(有效位数为 15 位)

字符类型

  • char:占用 2 字节,因为 char 类型描述了 UTF-16 编码中的一个代码单元,但是某些字符需要用两个 char 来表示,所以一个字符可能会占用 2 个或 4 个字节,但一个 char 是占用 2 个字节

布尔类型

  • boolean:这个是最特殊的,其他七种基本类型都给出了明确的内存占用字节数,就 boolean 类型没有给出精确的定义。因为对虚拟机来说根本不存在 boolean 这个类型,boolean 类型在编译后会使用其他数据类型表示,关于 boolean 类型究竟占用多少个字节有以下三种说法:

    • 1 个 bit(即 1/8 个字节),理由是 boolean 类型的值只有 true 和 false 两种逻辑值,在编译后会使用 1 和 0 来表示,这两个数在内存中只需要 1 位(bit)即可存储,位是计算机最小的存储单位
    • 1 个字节,理由是虽然编译后 1 和 0 只需占用 1 位空间,但计算机处理数据的最小单位是 1 个字节,1 个字节等于 8 位,实际存储的空间是:用 1 个字节的最低位存储,其他 7 位用 0 填补,如果值是 true 的话则存储的二进制为:0000 0001,如果是 false 的话则存储的二进制为:0000 0000
    • 4 个字节,理由来源是《Java虚拟机规范》一书中的描述:“虽然定义了 boolean 这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供 boolean 值专用的字节码指令,Java 语言表达式所操作的 boolean 值,在编译之后都使用 Java 虚拟机中的 int 数据类型来代替,而 boolean 数组将会被编码成 Java 虚拟机的 byte 数组,每个 boolean 元素占 8 位”。这样我们可以得出 boolean 类型单独使用是 4 个字节,在数组中又是 1 个字节的结论。关于为什么使用 int 来代替 boolean,原因是对于当下 32 位的处理器(CPU)来说,一次处理数据是 32 位(这里不是指的是 32/64 位系统,而是指 CPU 硬件层面),具有高效存取的特点
  • 总结:boolean 类型没有给出精确的定义,《Java虚拟机规范》给出了单独使用时 4 个字节,和在 boolean 数组中 1 个字节的定义,具体占用多少内存还要看虚拟机实现是否按照规范来,所以 1 个字节、4 个字节都是有可能的。这其实是运算效率和存储空间之间的博弈,两者都非常的重要