一、简介
在 Java 中,会根据变量的数据类型为变量分配存储空间,被分配的空间只能用来储存该类型数据,不同的数据类型会占用不同的内存空间。合理的使用可以避免空间的浪费,确保数据的准确性,便于理解变量的用途,用于表示最基本的数据形式。
二、基本数据类型
Java 中有 8 种基本数据类型,分别为:
- 6 种数值类型:
- 4 种整数型:byte、short、int、long
- 2 种浮点型:float、double
- 1 种字符类型:char
- 1 种布尔型:boolean。
这 8 种基本数据类型的默认值以及所占空间的大小如下表:
基本类型 | 字节数 | 默认值 | 取值范围 |
---|---|---|---|
byte | 1 | 0 | -27 ~ 27 -1 |
short | 2 | 0 | -215 ~ 215 -1 |
int | 4 | 0 | -231 ~ 231 -1 |
long | 8 | 0L | -263 ~ 263 -1 |
float | 4 | 0.0F | 1.4E-45 ~ 3.4028235E38 |
double | 8 | 0.0d | 4.9E-324 ~ 1.7976931348623157E308 |
char | 2 | ‘u0000’ | 0 ~ 65535 |
boolean | 1 | false | true、false |
可以看到,像 byte、short、int、long能表示的最大正数都减 1 了。这是为什么呢?这是因为在二进制补码表示法中,最高位是用来表示符号的(0 表示正数,1 表示负数),其余位表示数值部分。所以,如果我们要表示最大的正数,我们需要把除了最高位之外的所有位都设为 1。如果我们再加 1,就会导致溢出,变成一个负数。
⚠️注意:
- Java 里使用 long 类型的数据一定要在数值后面加上 L,否则将作为 int 类型解析。
- Java 里使用 float 类型的数据一定要在数值后面加上 f 或 F,否则将作为 double 类型解析。
这八种基本类型都有对应的包装类分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean 。
三、数据类型装换
3.1 自动类型转换
当把一个取值范围小的数据类型的值赋给一个取值范围大的数据类型的变量时,会自动进行类型转换。
public class Main {
public static void main(String[] args) {
byte b = 10;
// 会自动将 byte 转换为 int
int i = b;
}
}
自动类型转换遵循的规则是从低精度向高精度转换,常见的转换顺序为:
低 --------------------------------------------- 高
byte, short, char -> int -> long -> float -> double
3.2 强制类型转换
当把一个取值范围大的数据类型的值赋给一个取值范围小的数据类型的变量时,需要进行强制类型转换。但强制类型转换可能会导致数据丢失或精度降低。
public class Main {
public static void main(String[] args) {
double d = 10.5;
// 强制将 double 转换为 int 类型,小数部分会被抹去,而不是四舍五入
int i = (int) d;
}
}
在进行强制类型转换时,需要特别小心,确保转换的结果是符合预期的,否则可能会出现意外的结果。
public class Main {
public static void main(String[] args) {\
// 二进制:00000000 00000000 00000001 00000001
int i = 257;
// 二进制:00000001
byte b = (byte) i;
System.out.println("强制转换后的值:" + b);
}
}
运行结果:
强制转换后的值:1
⚠️解释: 由于 byte 类型是 1 个字节,而 int 类型是 4 个字节。在进行强制转换时,由于 byte 只能存储一个字节,byte 类型会取 int 类型的最后一个字节,所以将 int 类型的最后一个字节转换成 10 进制的整数后,所以就为 1。