从转换方式角度的转换类型🤨

  1. 隐式类型转换:也称为自动类型转换。当数据类型的范围小于目标数据类型的范围时,Java 会自动将其转换为目标数据类型。例如,int 类型可以自动转换为 long 类型,float 类型可以自动转换为 double 类型。

    // 隐式类型转换
    int i = 10;
    long l = i; // 将 int 类型转换为 long 类型
  2. 显式类型转换:也称为强制类型转换。当需要将一个较大的数据类型转换为较小的数据类型时,需要使用显式类型转换。例如,将 double 类型转换为 int 类型时,可以使用 (int) 运算符进行强制类型转换。

    // 显式类型转换
    double d = 3.14;
    int j = (int) d; // 将 double 类型转换为 int 类型

从数据类型角度的转换类型😯

  1. 数值类型转换:将一种数值类型的值转换为另一种数值类型的值。例如,将 int 类型转换为 double 类型或将 float 类型转换为 long 类型等。
    int i = 10;
    long l = i; // 将 int 类型转换为 long 类型
  2. 字符串类型转换:将一个字符串类型的值转换为另一种数据类型的值。例如,将字符串 "123" 转换为整数类型 int
    
    // 将字符串转换为整数类型
    String s = "123";
    int i = Integer.parseInt(s);

// 将字符串转换为浮点数类型
String s = "3.14";
double d = Double.parseDouble(s);

3. **布尔类型转换**:将一个布尔类型的值转换为另一种数据类型的值。例如,将布尔类型 true 转换为整数类型 int。
``` java
// 将布尔类型转换为整数类型
boolean b = true;
int i = b ? 1 : 0;

// 将整数类型转换为布尔类型
int i = 0;
boolean b = i != 0;

低级到高级的自动类型转换 :可以直接通过赋值进行转换, 没有精度丢失。
●高级到低级的强制类型转换 :高位转地位的数据类型会涉及到精度丢失的问题。

自动装箱、自动拆箱

  • 装箱:使用valueOf方法将int 基本数据类型转为Integer对象。
  • 拆箱:使用intValue方法将Integer 对象转为Integer对象。
    不要在循环中使用Integer
    image.png

image.png

integer 默认缓存127的数字,小于127时会使用缓存中的,当大于127时会创建新的Integer对象。

常见错误

类型不匹配

在进行类型转换时,如果目标数据类型和源数据类型不匹配,就会出现错误。例如,在将 String 类型转换为 int 类型时,如果字符串不是一个合法的整数,就会抛出 NumberFormatException 异常。

String s = "abc";
int i = Integer.parseInt(s); // 抛出 NumberFormatException 异常

溢出错误

在进行类型转换时,如果源数据类型的值超出了目标数据类型的范围,就会出现溢出错误。例如,在将一个较大的整数转换为 byte 类型时,如果整数的值超出了 byte 类型的范围,就会发生溢出。

int i = 300;
byte b = (byte) i; // b 的值为 44,发生了溢出

L问题

将整数类型的值赋给 long 类型的变量时需要添加 L 后缀
在将一个整数类型的值赋给 long 类型的变量时,需要在值的后面添加 L 后缀,否则编译器会将其解释为 int 类型的值,从而导致编译错误。

long a= 6553555522222; // 编译错误,需要添加 L 后缀
long b = 6553555522222L; // 正确的写法


此外其他类型的后缀:

long lNum  = 1234L;
float fNum = 1.23f;
double dNum = 1.23d;