特例:基本类型
在程序设计中经常用到一系列类型,它们需要特殊对待。可以把它们想像成“基本”类型。之所以特殊对待,是因为new将对象存储在“堆”里,故用new创建一个对象——特别是小的、简单的变量,往往不是很有效。因此,对于这些类型,Java采取与C和C++相同的方法。也就是说,不用new来创建变量,而是创建一个并非是引用的“自动”变量。这个变量直接存储“值”,并置于堆栈中,因此更加高效。
Java要确定每种基本类型所占存储空间的大小。它们的大小并不像其他大多数语言那样随机器硬件架构的变化而变化。这种所占存储空间大小的不变性是Java程序比用其他大多数语言编写的程序更具可移植性的原因之一。
基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
---|---|---|---|---|
boolean | —— | —— | —— | Boolean |
char | 16-bit | Unicode o | Unicode 216-1 | Character |
byte | 8 bit | -128 | +127 | Byte |
short | 16 bit | -215 | +215-1 | Short |
int | 32 bit | -231 | +231-1 | Integer |
long | 64 bit | -263 | +263-1 | Long |
float | 32 bit | IEEE754 | IEEE754 | Float |
double | 64 bit | IEEE754 | IEEE754 | Double |
void | —— | —— | —— | Void |
所有数值类型都有正负号,所有不要去寻找无符号的数值类型。
boolean类型所占存储空间的大小没有明确指定,仅定义为能够取字面值true或false。
基本类型具有的包装器类,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型。例如:
char r = 'x';
character ch = new Character(c);
也可以这样用:
Charactre ch = new Character('x');
JavaSE5的自动包装功能将自动地将基本类型转换为包装器类型:
Character ch = 'x';
并可以反向转换:
char c = ch;
高精度数字
Java提供了两个用于高精度计算的类:BigInter和BigDecimal。虽然它们大体上属于“包装器类”的范畴,但二者都没有对应的基本类型。
不过,这两个类包含的方法,提供的操作与对基本类型所能执行的操作相似。也就是说,能作用于int或float的操作,也同样能作用于BigInteger或BigDecimal。只不过必须以方法调用方式取代运算符方式来实现。由于这么做复杂了许多,所以运算速度会比较慢。在这里,我们以速度换取了精度。
BigInteger支持任意精度的整数。也就是说,在运算中,可以准确地表示任何大小的整数值,而不会丢失任何信息。
BigDecimal支持任何精度的定点数,例如,可以用它进行精确地货币计算。