Java数据类型详解
第三章 Java的基本程序设计结构
3.3 数据类型
- Java是一种强类型语言,这意味着Java中每个变量都必须为其声明一种类型。
- Java中有8中基本数据类型(primitive type),4种整型(定点数)、2种浮点类型、1种用于表示Unicode编码的字符char类型和一种用于表示真值的boolean类型。
3.3.1 整型
所占大小有小到大依次为:
类型 | 所占空间 | 取值范围 |
---|---|---|
byte | 1 Byte | -128 ~ 127 |
short | 2 Byte | -32768 ~ 32767 |
int | 4 Byte | -2147483648 ~ 2147483647(最大到10位,21亿) |
long | 8 Byte | -9223372036854775808 ~ 9223372036854775808(19位,922京) |
- int是最常用的整型;byte和short通常用于底层文件处理或需要节约空间的大数组。
- 相比C/C++,Java没有unsigned形式的整型。
- Java整型变量所占空间是机器无关的,跨平台不会出现溢出;而C/C++整型在不同位数处理器上所占空间不同,跨平台可能溢出。
- 长整型后缀有l/L,没有后缀的整型值默认为int。
- 2进制前缀为0b/0B,8进制前缀为0,16进制前缀为0x/0X。
- 从Java7开始,为方便阅读,可以在数字间加下划线,例如
1_000_000
3.3.2 浮点类型
类型 | 所占空间 | 取值范围 |
---|---|---|
float | 4 Byte | +/- 3.402 823 47E+38F (有效位数6-7位) |
double | 8 Byte | +/- 1.797 693 134 862 315 70E+308 (有效位数15位) |
- 大多数情况下使用double,因为很多情况下float很难满足需求。
- 当需要对接单精度数据库或存储大量数据时,可视情况选择float。
- float数值后有f或F,没有后缀的浮点值通常默认为double类型。
- (了解)可以使用16进制表示浮点值:例如
0x1.0p-3
这里尾数用16进制,指数采用十进制,指数的基数为2。
三个特殊的浮点值
- Infinity:正无穷大(非零数除以零)
- -Infinity:负无穷大
- NaN:非数(零除以零)
以上分别可以用Double.POSITIVE_INFINITY
、Double.NEGATIVE_INFINITY
和Double.NaN
来表示。
注意:
- 所有"非数"都是不相等的,不能用’=='来判断,需要使用
Double.isNaN(x)
的方法来检查。 - 普通浮点数不能用于无法接受舍入误差的金融计算中。例如sout(2-1.1)将打印0.899999…。如果不允许误差,应该使用BigDecimal类。
3.3.3 char类型
类型 | 所占空间 | 取值范围 |
---|---|---|
char | 2 Byte | \u0000 ~ \uFFFF |
- char类型的字面量值要用单引号括起来。
- char除了转义序列\u之外,也可以是表示特殊字符的转义序列,如\n。
- 转义序列\u还可以出现在加引号的字符常量或字符串之外。
注意:
- Unicode转义序列会在解析代码前被预处理。例如"\u0022+\u0022"会得到一个空串。
- 尤其也要注意注释中的\u,它可能会导致程序的语法错误(\u后面不是4个16进制数或\u000A是一个换行符等)。
3.3.4 Unicode与char类型
在Java中,char描述的是所有Unicode中“基本的多语言级别”的所有字符。char类型描述了UTF-16编码中的一个代码单元。(即2个字节,直接映射Unicode从U+0000 ~ U+FFFF的中除代理区1之外的所有字符)。
此外作者强烈建议不要在Java程序中使用char类型,除非确实需要UTF-16代码单元,最好将字符串作为抽象数据类型处理。
3.3.5 boolean类型
boolean类型只有两个值:true和false,用于判定逻辑条件。整型和boolean之间不能相互转换。
注意:这里和C/C++的区别,C/C++中可以将整型的0视为false。
说起代理区,就不得不谈谈UTF-16的编码方式。除了基本的多语言级别外,代理区是指为了将超过16位的那部分Unicode码点(010000-10FFFF),用一对连续的UTF-16代码单元表示,同时还要避免引起歧义而预留的区域。因此在U+0000 ~ U+FFFF中,Unicode编码的设计者已经预留出一部分基本的多语言级别不得使用的代理区:即从U+D800 ~ U+DFFF。这部分是用来与其余16个代码级别的码点进行区分的关键。 ↩︎