数据类型转换
数据类型转换是将一种数据类型转换为另一种数据类型。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 → int | Integer.parseInt(s) |
| String → long | Long.parseLong(s) |
| String → double | Double.parseDouble(s) |
| String → boolean | Boolean.parseBoolean(s) |
| int → String | String.valueOf(i) / Integer.toString(i) |
| int → boolean | 无直接转换,可用三元运算符 |
| char → String | String.valueOf(c) / Character.toString(c) |
