数据类型
引用数据类型的大小统一为4个字节,记录的是其引用对象的地址!
整型变量/常量
整型的范围与运行Java代码的机器无关,这正是Java程序具有很强移植能力的原因之一。
类型 | 占用存储空间 | 表数范围 |
---|---|---|
byte | 1字节 | - 2 7 2^7 27 ~ 2 7 2^7 27-1(-128~127) |
short | 2字节 | - 2 1 5 2^15 215 ~ 2 15 2^{15} 215-1(-32768~32767) |
int | 4字节 | - 2 31 2^{31} 231 ~ 2 31 2^{31} 231-1 (-2147483648~2147483647)约21亿 |
long | 8字节 | - 2 63 2^{63} 263 ~ 2 63 2^{63} 263-1 |
声明long型常量可以后加‘ l ’或‘ L ’:
long a = 55555555; //编译成功,在int表示的范围内(21亿内)。
long b = 55555555555;//不加L编译错误,已经超过int表示的范围。
long c = 55555555555L; // √
浮点型
类型 | 占用存储空间 | 表数范围 |
---|---|---|
float | 4字节 | -3.403E38~3.403E38 |
double | 8字节 | -1.798E308~1.798E308 |
- 默认是double类型
- 浮点数存在舍入误差,数字不能精确表示。如果需要进行不产生舍入误差的精确数字计算,需要使用
BigDecimal
类。 - 避免比较中使用浮点数,需要比较请使用
BigDecimal
类
字符型
字符型在内存中占2个字节,使用单引号来表示字符常量。
char
类型用来表示在Unicode编码表中的字符,可允许有65536个字符。
char eChar = 'a';
char cChar ='中';
char c = '\u0061'; // 从’\u0000’到’\uFFFF’之间的十六进制值来表示(前缀为u表示Unicode)
boolean类型
boolean
类型有两个常量值,true
和false
,在内存中占一位(不是一个字节),不可以使用 0 或非 0 的整数替代 true 和 false.
运算符
算术运算符
+,-,*,/,%
属于二元运算符(需要两个操作数)。
二元运算符的运算规则:
整数运算:
1. 如果两个操作数有一个为Long, 则结果也为long。
2. 没有long时,结果为int。即使操作数全为short,byte,结果也是int。
浮点运算:
3. 如果两个操作数有一个为double,则结果为double。
4. 只有两个操作数都是float,则结果才为float。
自增自减:
int a = 3;
int b = a++; //执行完后,b=3。a先赋值给b,a再自增。
System.out.println(a+" "+b); // 4, 3
a = 3;
b = ++a; ``//执行完后,b=4。a先自增,再给b赋值
System.out.println(a+" "+b); // 4, 4
位运算符
位运算指的是进行二进制位的运算。
位运算符 | 说明 |
---|---|
~ | 取反 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
<< | 左移运算符,左移1位相当于乘2 |
>> | 右移运算符,右移1位相当于除2取商 |
int a = 3 * 2 * 2;
int b = 3<<2; //相当于:3*2*2;
int c = 12 / 2 / 2;
int d = 12>>2; //相当于12/2/2;
&和|
既是逻辑运算符,也是位运算符。如果两侧操作数都是boolean类型,就作为逻辑运算符。如果两侧的操作数是整数类型,就是位运算符。- 不要把
^
当做数学运算“乘方”,是“位的异或”操作
类型转换
自动类型转换
自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型。(虚线表示在转换时可能会有精度的损失)
可以将整型常量直接赋值给byte、 short、 char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可。
short b = 12;
short b = 12345556; // Error
强制类型转换
(type)var
强制类型转换,又被称为造型,用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。
double x = 3.14;
int nx = (int)x; // 3
// 特例
int x = 300;
byte bx = (byte)x; // 44