基本类型 (primitive type)

整型

Java 提供 4 种整形类型:

  • int -> 4byte
  • short -> 2byte
  • long -> 8byte -> L/l
  • byte -> 1byte

Java 没有任何无符号(unsigned)形式的整形类型。
Java 的整形范围与运行的 Java 代码的机器无关,无论在什么机器上 int 就是四个字节。这也是 Java 的优点,因为 Java 运行在 JVM 上,所以整形的范围就交给了 JVM 去处理。但是在 C 和 C++ 中却不是这样的,你要考虑在不同的处理器上的 int 或 long 的字节是多少。如:在 8086 这样的 16 位处理器上整型数值占 2 字节;不过,在 32 位处理器(比如 Pentium 或 SPARC )上,整型数值则为 4 字节。
long 类型后面要加上后缀 L/l。 e.g. long = 400000000000L
十六进制要加上前缀 0x/0X。 e.g. 0xCAFE = 13290238
八进制要加上前缀 0。 e.g. 010 = 8
从 Java 7 开始:
加上前缀 0b/0B 可以写二进制。 e.g. 0b1001 = 9
可以在数字字面量加上下划线。 e.g. 1_000_000 = 0b1111_0100_0010_0100_0000 = 1000000

浮点类型

float -> 4byte -> F/f
double -> 8byte -> D/d
需要注意的是:
float 类型的后缀为 F/f (e.g. 3.14F)。没有后缀 F 的浮点数值(e.g. 3.14)默认为double 类型。
可以使用十六进制表示浮点数值。例如,0.125=2 可以表示成 0x1.0p-3。在十六进制表示法中,使用 p 表示指数,而不是 e。注意,尾数采用十六进制,指数采用十进制。指数的基数是 2,而不是 10。
所有的浮点数值计算都遵循 IEEE 754 规范。
有三个特殊的浮点数值:正无穷大、负无穷大、NaN(不是一个数字) 分别用 Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN 表示。Float 同样也遵循这样的规则。
0/0 或 负数的平方根 结果为 NaN 。
不能直接检测一个特定值是否等于 Double.NaN:

  1. if (x == Double.NaN) // is never true // 永远不会为真

这是因为所有 “非数值” 的值都认为是不相同的。解决方法也很简单:

  1. if (Double.isNaN(x)) // check whether x is "not a number"

2.0 - 1.1 将输出 0.88999999999999999,而不是 0.9 。这是因为浮点数采用二进制系统表示,而二进制系统中无法精确地表示 ,这就像十进制无法精确地表示 。如果你有精度要求,可以使用 BigDecimal 类。

字符类型

是 2 个字节的 UTF-16 中的代码单元
char 类型原本表示单个字符。但是现在,有些 Unicode 字符可以用一个 char 值描述,另外一些 Unicode 字符则需要两个 char 值。这是因为在 Java 中,一个 char 代表一个 UTF-16 编码中的一个代码单元。在基本多语言级别(BMP)中,一个 char 代表一个字符,但在辅助级别,两个 char 代表一个字符。具体可看 WiKi 上的解释
'A' 是编码值为 65 所对应的字符常量。它与 "A" 不同,它是包含一个字符 A 的字符串
char 可以用十六进制表示,其范围从 \u0000 到 \Uffff 。例如:\u2122表示注册符号(TM),\u03C0表示希腊字母π。
转移序列除了 \u 外,还有:

| 转移序列 | 名称 | Unicode 值 | | —- | —- | —- |

| \b | 退格 | \u0008 |

| \t | 制表 | \u0009 |

| \n | 换行 | \u000a |

| \r | 回车 | \u000d |

| \“ | 双引号 | \u0022 |

| \‘ | 单引号 | \u0027 |

| \\ | 反斜杠 | \u005c |

这些转移序列可以出现在加引号的字符字面量或字符串中。其中,转移序列 \u 可以单独出现在代码中。如:

  1. public static void main(String\u005B\u005D args)
  2. // like this
  3. public static void main(String[] args)

需要注意的是,Unicode 转义序列会在解析代码之前得到处理。例如,”\u0022 + \u0022” 并不是一个由引号(U+0022)包围加号构成的字符串。实际上,\u0022 会在解析之前转换为 “,这会得到 “”+””,也就是一个空串。
更小心的是注释中的 \u:

  1. // \u00A0 is a newline
  2. // 上述会产生一个语法错误,因为解析代码之前, \u00A0 会替换为一个换行符
  3. // Look inside C:\user
  4. // 上述同样会产生一个语法错误,因为 \u 后面没有跟一个四个的十六进制数

boolean 类型

一个字节
两个值 :true 和 false ,用来逻辑判断。
注意:整形值和布尔值之间不能进行相互转换 ,所以就没有 if (x = 0) 这样 C++ 中的尴尬问题。