基本数据类型表
类型 | 存储需求 | 取值范围 | 包装类型 |
---|---|---|---|
byte | 1字节 | -128 ~ 127 | Byte |
short | 2字节 | -32 768 ~ 32 767 | Short |
int | 4字节 | -2 147 483 648 ~ 2 147 483 647 ( 正好超过20 亿) | Integer |
long | 8字节 | -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 | Long |
float | 4字节 | 大约± 3.402 823 47E+38F (有效位数为6 ~ 7 位) | Float |
double | 8宇节 | 大约± 1.797 693 134 862 315 70E+308 (有效位数为15 位) | Double |
char | 2字节 | 单个字符 | Character |
boolean | true、false | Boolean |
注: Java JVM规范没有明确指出boolean的取值范围,1字节或者4字节都有可能。
转义字符表
转义序列 | 名称 | Unicode值 |
---|---|---|
\ddd | 1~3位八进制数据所表示的字符,如:\141 | \ddd |
\uxxxx | 4位16进制数据所表示的字符,如:\u2122 | \uxxxx |
\b | 退格 | \u0008 |
\" | 双引号 | \u0022 |
\t | 制表 | \u0009 |
\’ | 单引号 | \u0027 |
% | 反斜杠 | \u005c |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
注:
可以使用十六进制表示浮点数值。例如, 0.125=2^-3 可以表示成0xl.0p-3。在十六进制表示法中, 使用p 表示指数, 而不是e。注意, 尾数采用十六进制, 指数采用十进制。指数的基数是2, 而不是10。所有的浮点数值计算都遵循IEEE 754 规范。具体来说,下面是用于表示溢出和出错情况的三个特殊的浮点数值:
•正无穷大
•负无穷大
•NaN (不是一个数字)
例如, 一正整数除以0的结果为正无穷大。计算0/0 或者负数的平方根结果为NaN。
一些示列:
int a = 0b1010; // 二进制,0b开头
int aa = 0b1010_10; // _为了可读性
int b = 07; // 八进制,0开头
int c = 0xff; // 十六进制,0x开头
double d = 0x8p-3; // 2^-3 * 8
char a = ‘\u005B’; // [
char b = ‘\u005D’; // ]
char c = ‘\141’; // a
char d = ‘a’;
char f = 97;
Unicode与char
码点是指与一个编码表中的某个字符对应的代码值。
在Unicode标准中,码点采用十六进制书写,并加上前缀U+, 例如U+0041 就是拉丁字母A 的码点。Unicode 的码点可以分成17个代码级别。第一个代码级别称为基本的多语言级别, 码点从U+0000 到U+FFFF, 其中包括经典的Unicode代码;``其余的16个级另码点从U+10000 到U+10FFFF , 其中包括一些辅助字符。
UTF-16 编码采用不同长度的编码表示所有Unicode 码点。在基本的多语言级别中, 每个字符用16位表示,通常被称为代码单元
; 而辅助字符采用一对连续的代码单元进行编码。这样构成的编码值落人基本的多语言级别中空闲的2048 字节内, 通常被称为替代区域。U+D800 ~ U+DBFF用于第一个代码单元,U+DC00 ~ U+DFFF 用于第二个代码单元
。这样设计十分巧妙, 我们可以从中迅速地知道一个代码单元是一个字符的编码, 还是一个辅助字符的第一或第二部分。例如,⑪是八元数集的一个数学符号, 码点为U+1D546, 编码为两个代码单元U+D835和U+DD46。
在Java 中,char 类型描述了UTF-16 编码中的一个代码单元。
自动装箱、拆箱
自动装箱
在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:
Integer i = new Integer(10);
而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可了:
Integer i = 10;
hen
这个过程中会自动根据数值创建对应的Integer对象,即Integer i = 10;
会自动转化为Integer i = Integer.value0f(10);
这就是装箱。
自动拆箱
与自动装箱对应的便是自动拆箱。在把一个Integer赋值给一个int时便存在拆箱。
Integer i = new Integer(10);
int n = i;
// 自动拆箱,实际执行int n = i.intValue();
这就是自动拆箱。
注:
其他类型的装箱、拆箱类似。
总结:
装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的。(xxx代表对应的基本数据类型)。
甚至在算术表达式中也能够自动地装箱和拆箱。例如,可以将自增操作符应用于一个包装器引用:
Integer n = 3;
n++;
编译器将自动地插人一条对象拆箱的指令, 然后进行自增计算, 最后再将结果装箱。