一、Java类型的八大基本数据类型
(原始数据类型(Java™ 教程> 学习Java语言>语言基础) (oracle.com))
-
byte:(整数型:1字节)数据类型为 8 位有符号二进制的补码整数。它的最小值为 -128,最大值为 127(含)。数据类型对于节省大型数组中的内存非常有用,其中内存节省实际上很重要。它们也可以用来代替它们的限制有助于澄清你的代码的地方;变量的范围有限这一事实可以作为一种文档形式。
byte
byte
int
-
short:(整数型:2字节)数据类型是 16 位有符号二进制的补码整数。它的最小值为 -32768,最大值为 32767(含)。与 一样,相同的准则适用:在内存节省实际上很重要的情况下,您可以使用 来节省大型数组中的内存。
short
byte
short
-
int:(整数型:4字节)默认情况下,数据类型为 32 位有符号二进制补码整数,最小值为 -2^31,最大值为 (2^31)-1。在 Java SE 8 及更高版本中,可以使用数据类型来表示无符号的 32 位整数,该整数的最小值为 0,最大值为 232-1。使用 Integer 类将数据类型用作无符号整数。有关详细信息,请参阅数字类部分。静态方法(如 等)已添加到 Integer 类中,以支持无符号整数的算术运算。
int
int
int
compareUnsigned
divideUnsigned
-
long:(整数型:8字节)数据类型为 64 位二进制补码整数。带符号长整型的最小值为 -2^63,最大值为 (2^63)-1。在 Java SE 8 及更高版本中,可以使用数据类型来表示无符号的 64 位长整型,该长整型的最小值为 0,最大值为 (2^64)-1。如果需要的值范围比提供的值范围更宽,请使用此数据类型。Long 类还包含诸如 等方法,以支持无符号 long 的算术运算。
long
long
int
compareUnsigned
divideUnsigned
-
float:(浮点型:4字节)数据类型为单精度 32 位 IEEE 754 浮点数。其值范围超出了本讨论的范围,但在 Java 语言规范的浮点类型、格式和值部分中指定。与 和 的建议一样,如果需要在浮点数的大型数组中节省内存,请使用 (而不是 )。此数据类型绝不应用于精确值,例如货币。为此,您需要改用java.math.BigDecimal 类。数字和字符串涵盖Java平台提供的其他有用类。
float
byte
short
float
double
BigDecimal
-
double:(浮点型:8字节)数据类型为双精度 64 位 IEEE 754 浮点数。其值范围超出了本讨论的范围,但在 Java 语言规范的浮点类型、格式和值部分中指定。对于十进制值,此数据类型通常是默认选项。如上所述,此数据类型绝不应用于精确值,例如货币。
double
-
布尔值:(布尔型)数据类型只有两个可能的值:True和False 。将此数据类型用于跟踪真/假条件的简单标志。此数据类型表示一位信息,但其“大小”不是精确定义的。
boolean
true
false
-
char:(字符型:2字节)数据类型是单个 16 位 Unicode 字符。它的最小值为 (或 0),最大值为 (或 65,535(含 65,535)。
char
'\u0000'
'\uffff'
二、如上所示,boolean的值类型是没有定义的大小的,那么它是如何在计算机里进行存储(如编译为字节码文件)表示的呢?
实际上,这个数据类型问题和java虚拟机有关。在《Java虚拟机规范》一书中,其实也对这个问题进行过说明:
1.JVM没有提供booolean类型专用的字节码指令,而是使用int相关指令来代替(即编译为字节码文件时boolean的值类型大小是4字节)。
2.对boolean数组的访问与修改,会共用byte数组的baload和bastore指令(即编译为字节码文件时boolean数组的值类型大小是1字节)。--->此处前提是在Oralce的JVM中,在非Oralce的JVM中,其值类型大小还有待考证。
三、为什么boolean的值类型在编译为字节码文件时要转化为int类型呢,用byte或short类型不是更节省内存空间吗?
经过查阅资料发现,使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),32 位 CPU 使用 4 个字节是最为节省的,哪怕你是 1 个 bit 他也是占用 4 个字节。因为 CPU 寻址系统只能 32 位 32 位地寻址,具有高效存取的特点。
四、究其根本,还是得看虚拟机的实现。
在java规范中,并没有明确指定其大小,因此即使在《Java虚拟机规范》给出了boolean为4个字节和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。