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);}}
