Java 提供了 8 种基础数据类型,同时每一种基础数据类型都会对应着一个包装类,这个我们后续会进行介绍包装类相关内容。
1. 整型
整型一般有 4 种类型:byte
、short
、int
、long
,我们需要了解下不同类型的整型占用内存大小以及取值范围。
数据类型 | 占用内存 | 取值范围 | 包装类 |
---|---|---|---|
byte | 1个字节 | -2^7 - 2^7 -1 | Byte |
short | 2个字节 | -2^15 - 2^15 -1 | Short |
int | 4个字节 | -2^31 - 2^31 -1 | Integer |
long | 8个字节 | -2^63 - 2^63 -1 | Long |
2. 浮点型
浮点型一般有float
和double
两种类型。
数据类型 | 占用内存 | 取值范围 | 包装类 |
---|---|---|---|
float | 4个字节 | 1.4E-45 ~ 3.4028235E38 | Float |
double | 8个字节 | 4.9E-324 ~ 1.7976931348623157E308 | Double |
这里并不需要记住,如果需要知道具体取值范围,可以运行以下程序:
public class FloatDoubleRange {
public static void main(String[] args) {
System.out.println("Float Min Value: " + Float.MIN_VALUE);
System.out.println("Float Max Value: " + Float.MAX_VALUE);
System.out.println("Double Min Value: " + Double.MIN_VALUE);
System.out.println("Double Max Value: " + Double.MAX_VALUE);
}
}
2.1 浮点数精度丢失
浮点数是存在精度损失的,在定义数据类型时需要特别注意,尤其是在做交易系统时对于金额变量的定义,下面我们来看一下示例:
public class FloatPrecisionLoss {
public static void main(String[] args) {
float amount = 1.2f;
int cost = 1;
System.out.println(amount - cost); // 0.20000005
}
}
💡 可以看到,浮点数确实是存在精度丢失的,上述示例看起来影响并不大,但如果我们的金额是 100 亿,可想而知会误算多少前。
3. 字符型
数据类型 | 占用内存 | 取值范围 | 包装类 |
---|---|---|---|
char | 2个字节 | 65536 | Character |
4. 布尔型
数据类型 | 占用内存 | 取值范围 | 包装类 |
---|---|---|---|
boolean | 1个字节 | true / false |
Boolean |
5. 数据类型间的转换
基础数据类型的转换分为 2 种,分别为隐式类型转换(自动转) 和显式类型转换(强转)。隐式类型转换就是 JVM 会负责数据类型的转换,而显式类型转换则是需要我们手动对数据类型进行强制转换。
转型一般遵循以下 2 条规则:
- 任何有精度损失的转型都需要强转
- 取值范围大的数据类型可以自动转换为取值范围小的数据类型
public class ForceTransform {
public static void main(String[] args) {
float num1 = 12.34f;
int num2 = 3;
int num3 = (int) (num1 / num2);
System.out.println(num3);
}
}