一、基本数据类型
1.1 整型
Java 整型的范围与运行 Java 代码的机器无关。
长整型数值有一个后缀L
或l
,十六进制数值前有一个前缀0x
或0X
,八进制有一个前缀0
。
从 Java 7 开始,可以加上前缀0b
或0B
表示二进制数,还可以为数字字面量加下划线(如 1_000_000 表示 100 万)。下划线只是为了让数字更易读,Java 编译器在编译时会去除这些下划线。
类型 | 存储需求 | 取值范围 |
---|---|---|
int | 4 字节 | -2,147,483,648 ~ 2,147,483,647(刚刚超过 20 亿) |
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 |
1.2 浮点类型
float
类型的数值有一个后缀F
或f
,没有后缀F
的浮点数值默认为double
类型。
由于浮点数值采用二进制系统表示,而二进制系统无法精确表示分数 1/10
,所以浮点数值存在舍入误差。
类型 | 存储需求 | 取值范围 |
---|---|---|
float | 4 字节 | 大约 ± 3.40282347E+38F(有效位数为 6 ~ 7 位) |
double | 8 字节 | 大约 ± 1.79769313486231570E+308(有效位数为 15 位) |
浮点数值计算遵循 IEEE 754 规范。一个正数除以0
的结果为无穷大,0
除以0
的结果为NaN
。
特殊的浮点数值 | 表示方式 |
---|---|
正无穷大 | Double.POSITIVE_INFINITY |
负无穷大 | Double.POSITIVE_INFINITY |
NaN(不是一个数字) | Double.NaN |
要判断一个特定值是否等于Double.NaN
,不能使用==
判断,需要使用Double.isNaN
方法来判断。
if(x == Double.NaN) // is never true
if(Double.isNaN(x)) // check whether x is "not a number"
1.3 char 类型
Java 的char
类型占用两个字节,使用 Unicode 字符集,并且采用 UTF-16 编码方式。
一个 Unicode 字符在 UTF-16 编码中由 1 ~ 2 个 代码单元
组成,一个char
值表示 UTF-16 编码中的一个代码单元
。(看不懂可忽略,只要知道一个 Unicode 字符由 1 ~ 2 个char
值描述就行)
char
类型可以使用转义序列 \u
表示,例如\u0061
表示字符a
。
\u
转义序列与其他转义序列不同,它可以出现在加引号的字符常量或字符串之外。如下所示,第一行代码中的\u005B
和\u005D
分别是 [
和]
的编码。
public static void main(String\u005B\u005D args)
值得注意的 Unicode 转义序列会在解析代码前进行处理。例如,下面的代码看上去是一个注释,但是会产生一个语法错误,因为\u000A
会被替换为一个换行符。(还有一个错误,能看出来么)
// \u000A is a newline
// look inside c:\user
String s = "\u0022+\u0022"; // 表示一个空串
1.4 boolean 类型
与 C++ 不同,Java 中的整型值和布尔值之间不能进行相互转换。
二、数值类型之间的转换
2.1 自动类型转换
在进行运算时,我们经常需要将一种数值类型转换为另一种数值类型,图 2-1 给出了数值类型之间的合法转换。
在图 2-1 中,6 个实线箭头,表示无信息丢失的转换;另外 3 个虚线箭头,表示可能有精度损失的转换。可以用箭头推出的转换会在运算时自动进行;否则,需要进行强制类型转换
。
2.2 强制类型转换
可能损失信息(不是损失精度)的转换,需要通过强制类型转换来完成,如下所示。
double x = 9.997;
int nx = (int)x; // double -> int
double x = 9.997;
int nx = (int)Math.round(x); // long -> int
int x = 0;
x += 3.5; // long -> int(隐式的强制类型转换)
如有错误,欢迎指正。.... .- ...- . .- -. .. -.-. . -.. .- -.-- -.-.--