数据类型
图有6个实线箭头,表示无信息丢失的转换;另外有3个虚线箭头,表示可能有精度损失的转换。
例如,123 456 789是一个大整数,它所包含的位数比float类型所能够表示的位数多。当将这个整数转换为float类型时,将会得到正确的大小,但是会损失一些精度。
int n=123456789;
float f=n;//f is 1.23456792E8
| 基本类型 | 类型 | 存储需求 | 后缀表示 | 取值范围 | 备注 |
| 整型 | int | 4字节 | -2147483648~2147483647(刚刚超过20亿) | ||
| short | 2字节 | -32768~32767 | |||
| long | 8字节 | l或者L | -9223372036854775808~9223372036854775807 | ||
| byte | 1字节 | -128~127 | |||
| 浮点型 | float | 4字节 | f或者F | 大约 ±3.40282347E+38F(有效位数为6~7位) | |
| double | 8字节 | d或者D | 大约±1.79769313486231570E+308(有效位数为15位) | ||
| 字符型 | char | 2字节 | 0~65535 | 描述了UTF-16编码中的一个代码单元。 强烈建议不要在程序中使用char类型。 |
|
| boolean型 | boolean | 1字节 | true/false |
思维扩展
main方法必须是public吗?
一开始main方法并不要求必须是public的。
有个程序员报告了这个bug。Sun公司的工程师回复说:Java虚拟机规范并没有强制要求main方法一定是public的,并且“修复这个bug可能带来其他隐患”。
但从Java1.4开始,强制main方法必须是public的。
浮点数计算注意事项?
浮点数值不适用于无法接受舍入误差的金融计算。
例如,命令System.out.println(2.8-1.1)将打印出0.899999999999,而不是人们期望的0.9。这种舍入误差的主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确地表示分数1/10。这就好像十进制无法精确地表示分数1/3一样。如果在数值计算中不允许有任何舍入误差,就应该使用BigDecimal类。
Unicode
char类型遇到的问题
Java采用Unicode进行编码,char类型在内存中占2个字节-16位,其值的范围在0-65535(U+0000 ~ U+FFFF)之间。20 世纪 80 年代开始启动设计 Unicode 编码时,人们认为两个字节(16 位)的代码宽度足以对世界上各种语言的所有字符进行编码,并有足够空间留给未来的扩展。所以在设计 Java 时决定采用 16 位的 Unicode 字符集。目前Unicode编码范围在0-1114111(U+0000 ~ U+10FFFF)之间,显然一个char类型已经不能够存65535以外的字符了。
char如何表示Unicode中65535以后的字符?
Unicode和char类型
如下转义序列,可以出现在加引号的字符字面量或字符串中,如'\u2122'和"hello\n"。此外,转义序列\u还可以出现在加引号的字符常量或字符串之外,public static void main(String\u005B\u005D args)。
| 转义序列 | 名称 | Unicode值 |
|---|---|---|
| \b | 退格 | \u0008 |
| \t | 制表 | \u0009 |
| \n | 换行 | \u000a |
| \r | 回车 | \u000d |
| " | 双引号 | \u0022 |
| ' | 单引号 | \u0027 |
| \ | 反斜杠 | \u005c |
Unicode转义序列会在解析代码之前得到处理。
例如
-
"\u0822+\u8022"并不是一个由引号(U+0022)包围加号构成的字符串。实际上,\u0822会在解析之前转换为",这会得到""+"",也就是一个空串。
-
注释当中的\u。
// \u000A is a newLine会产生一个语法错误。因为读程序时,\u000A会替换为一个换行符。
// look inside c:\users也会产生一个语法错误,因为\u后面没有跟着4个16进制数。