Skip to content

数据类型转换

数据类型转换是将一种数据类型转换为另一种数据类型。Java 中有两种类型转换:自动类型转换和强制类型转换。

自动类型转换(隐式转换)

容量小的类型自动转换为容量大的类型:

byte → short → char → int → long → float → double

转换条件:两种类型兼容,且目标类型比源类型范围大。

java
// byte → int
byte b = 100;
int i = b;  // 自动转换
System.out.println(i);  // 100

// int → long
int num = 100;
long l = num;  // 自动转换
System.out.println(l);  // 100

// int → double
int a = 10;
double d = a;  // 自动转换
System.out.println(d);  // 10.0

// char → int(字符转换为 ASCII 码)
char c = 'A';
int ascii = c;  // 自动转换
System.out.println(ascii);  // 65

转换图示:

byte (8位)    →  short/char (16位)  →  int (32位)  →  long (64位)

                                                 float (32位)

                                                 double (64位)

特殊说明:char 可以自动转换为 int 或更大的类型,但 byte 和 short 之间不会自动转换。

java
char c = '中';
int i = c;  // 可以
System.out.println(i);  // 20013

byte b = 10;
short s = b;  // 编译错误:需要强制转换

强制类型转换(显式转换)

语法:(目标类型) 表达式

java
// double → int(小数部分丢失)
double d = 99.9;
int i = (int) d;
System.out.println(i);  // 99

// long → int
long l = 100L;
int num = (int) l;
System.out.println(num);  // 100

// int → byte
int n = 130;
byte b = (byte) n;
System.out.println(b);  // -126(溢出)

溢出问题

强制转换可能发生溢出,因为低位数据被保留,高位数据丢失。

java
int i = 130;
byte b = (byte) i;

// 130 的二进制:00000000 00000000 00000000 10000010
// 取低 8 位:10000010 = -126(原码/反码规则)

int big = 1000;
byte small = (byte) big;
System.out.println(small);  // -24

浮点数转整数

浮点数转整数直接截断小数部分,不进行四舍五入。

java
// 直接截断小数部分
System.out.println((int) 3.7);    // 3
System.out.println((int) 3.9);    // 3
System.out.println((int) -3.7);   // -3
System.out.println((int) -3.9);   // -3

// 四舍五入使用 Math.round()
System.out.println(Math.round(3.7));   // 4
System.out.println(Math.round(3.4));  // 3

转换优先级规则

当有多种类型参与运算时,会发生自动类型提升。

java
// 规则一:byte、short、char 会自动提升为 int
byte b1 = 10;
byte b2 = 20;
// byte b3 = b1 + b2;  // 错误:结果是 int
byte b3 = (byte) (b1 + b2);  // 正确

// 规则二:long 与其他类型运算,结果是 long
int i = 10;
long l = 20L;
long result = i + l;  // int 自动转换为 long

// 规则三:float 与其他类型运算,结果是 float
int x = 10;
float f = 20.5f;
float result2 = x + f;  // int 自动转换为 float

// 规则四:double 运算,结果是 double
double pi = 3.14;
int num = 10;
double result3 = pi + num;  // int 自动转换为 double

自动提升规则图解:

byte → short/char → int → long → float → double
  ↑          ↑
  └──────────┘
  (byte 和 short 会提升为 int)

常见转换场景

字符串转数值

java
String str = "123";

// 方式一:使用包装类的 parseXxx 方法
int num = Integer.parseInt(str);      // 123
long l = Long.parseLong(str);          // 123L
double d = Double.parseDouble(str);    // 123.0

// 方式二:使用 valueOf 方法
int num2 = Integer.valueOf(str);       // 返回 Integer,自动拆箱

// 带进制转换
int hex = Integer.parseInt("FF", 16);  // 255
int bin = Integer.parseInt("1010", 2); // 10

数值转字符串

java
int num = 123;

// 方式一:拼接空字符串
String s1 = "" + num;         // "123"

// 方式二:toString 方法
String s2 = Integer.toString(num);  // "123"

// 方式三:String.valueOf
String s3 = String.valueOf(num);    // "123"

// 方式四:format
String s4 = String.format("%d", num);  // "123"

字符转数字

java
char c = '5';

// 方式一:ASCII 码运算
int num = c - '0';  // 5

// 方式二:Character.getNumericValue
int num2 = Character.getNumericValue(c);  // 5

// 方式三:Integer.parseInt
int num3 = Integer.parseInt(String.valueOf(c));  // 5

字符串转字符数组

java
String str = "Hello";
char[] chars = str.toCharArray();
// ['H', 'e', 'l', 'l', 'o']

// char 数组转字符串
String newStr = new String(chars);  // "Hello"

注意事项

精度丢失:double 转 float 可能丢失精度,精确计算应使用 BigDecimal。

java
double d = 1.23456789012345678;
float f = (float) d;
System.out.println(f);  // 1.2345679

// 解决方案:使用 BigDecimal
BigDecimal bd = new BigDecimal("1.23456789012345678");

避免不必要的转换:int 转 long 不需要强制转换,Java 会自动处理。

java
// 不必要的转换
int i = 10;
long l = (long) i;  // 不需要

// 直接赋值
long l2 = 10;  // 自动转换

类型提升的影响:byte、short、char 运算时会自动提升为 int。

java
short s1 = 10;
short s2 = 20;
short sum = s1 + s2;  // 编译错误

// 正确写法
int sum2 = s1 + s2;      // 自动提升为 int
short sum3 = (short) (s1 + s2);  // 强制转换

转换方法总结

转换类型方法
String → intInteger.parseInt(s)
String → longLong.parseLong(s)
String → doubleDouble.parseDouble(s)
String → booleanBoolean.parseBoolean(s)
int → StringString.valueOf(i) / Integer.toString(i)
int → boolean无直接转换,可用三元运算符
char → StringString.valueOf(c) / Character.toString(c)

基于 VitePress 构建