Java 提供了 8 种基础数据类型,同时每一种基础数据类型都会对应着一个包装类,这个我们后续会进行介绍包装类相关内容。

1. 整型

整型一般有 4 种类型:byteshortintlong,我们需要了解下不同类型的整型占用内存大小以及取值范围。

数据类型 占用内存 取值范围 包装类
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. 浮点型

浮点型一般有floatdouble 两种类型。

数据类型 占用内存 取值范围 包装类
float 4个字节 1.4E-45 ~ 3.4028235E38 Float
double 8个字节 4.9E-324 ~ 1.7976931348623157E308 Double

这里并不需要记住,如果需要知道具体取值范围,可以运行以下程序:

  1. public class FloatDoubleRange {
  2. public static void main(String[] args) {
  3. System.out.println("Float Min Value: " + Float.MIN_VALUE);
  4. System.out.println("Float Max Value: " + Float.MAX_VALUE);
  5. System.out.println("Double Min Value: " + Double.MIN_VALUE);
  6. System.out.println("Double Max Value: " + Double.MAX_VALUE);
  7. }
  8. }

2.1 浮点数精度丢失

浮点数是存在精度损失的,在定义数据类型时需要特别注意,尤其是在做交易系统时对于金额变量的定义,下面我们来看一下示例:

  1. public class FloatPrecisionLoss {
  2. public static void main(String[] args) {
  3. float amount = 1.2f;
  4. int cost = 1;
  5. System.out.println(amount - cost); // 0.20000005
  6. }
  7. }

💡 可以看到,浮点数确实是存在精度丢失的,上述示例看起来影响并不大,但如果我们的金额是 100 亿,可想而知会误算多少前。

3. 字符型

数据类型 占用内存 取值范围 包装类
char 2个字节 65536 Character

4. 布尔型

数据类型 占用内存 取值范围 包装类
boolean 1个字节 true / false Boolean

5. 数据类型间的转换

基础数据类型的转换分为 2 种,分别为隐式类型转换(自动转) 和显式类型转换(强转)。隐式类型转换就是 JVM 会负责数据类型的转换,而显式类型转换则是需要我们手动对数据类型进行强制转换。

转型一般遵循以下 2 条规则:

  • 任何有精度损失的转型都需要强转
  • 取值范围大的数据类型可以自动转换为取值范围小的数据类型
  1. public class ForceTransform {
  2. public static void main(String[] args) {
  3. float num1 = 12.34f;
  4. int num2 = 3;
  5. int num3 = (int) (num1 / num2);
  6. System.out.println(num3);
  7. }
  8. }