Java 中的字符串转换主要可以分为两大类:

- 将其他类型转换为
String - 将
String转换为其他类型
其他类型转换为 String (Convert to String)
有几种常用且推荐的方法,它们的性能略有不同。
使用 String.valueOf() (最推荐)
这是最常用、最安全的方法,它是一个静态方法,可以接受几乎所有基本数据类型和对象作为参数,并将其转换为字符串。
特点:
- 通用性强:适用于所有基本数据类型 (
int,double,boolean等) 和对象。 - 处理
null安全:如果传入的参数是null,String.valueOf(null)会返回字符串"null",而不会抛出NullPointerException。
示例代码:

int num = 123; boolean flag = true; double pi = 3.14159; Object obj = null; // 基本类型转换 String str1 = String.valueOf(num); // 结果: "123" String str2 = String.valueOf(flag); // 结果: "true" String str3 = String.valueOf(pi); // 结果: "3.14159" // 对象转换 String str4 = String.valueOf(obj); // 结果: "null" (非常安全)
使用 String 的 拼接 (最直观)
这是最直观、最简单的方式,尤其适用于字符串拼接,当任何类型与 String 通过 连接时,Java 会自动调用该类型的 toString() 方法。
特点:
- 简单直观:代码易读。
- 性能问题:在循环中进行大量字符串拼接时,会创建多个临时
String对象,导致性能下降,应优先使用StringBuilder或StringBuffer。 null不安全:如果拼接的对象是null,会得到"null"字符串,但拼接操作本身不会报错。
示例代码:
int num = 456; boolean flag = false; String str1 = num + ""; // 结果: "456" String str2 = "The value is: " + num; // 结果: "The value is: 456" String str3 = flag + ""; // 结果: "false"
调用对象的 toString() 方法
每个 Java 对象都继承自 Object 类,而 Object 类中定义了 toString() 方法,任何对象都可以调用此方法来获取其字符串表示形式。
特点:
- 面向对象:是对象自身提供的方法。
- 可能需要重写:很多类(如自定义类)默认的
toString()返回的是类的全限定名和哈希码(如com.example.MyClass@1a2b3c4d),通常需要重写以返回有意义的信息。 null不安全:如果对象本身是null,调用toString()会直接抛出NullPointerException。
示例代码:
Integer integerObj = 789;
String str1 = integerObj.toString(); // 结果: "789"
// 自定义类示例
class Person {
private String name;
public Person(String name) { this.name = name; }
@Override
public String toString() {
return "Person[name=" + this.name + "]";
}
}
Person person = new Person("Alice");
String str2 = person.toString(); // 结果: "Person[name=Alice]"
// Integer objNull = null;
// String str3 = objNull.toString(); // 抛出 NullPointerException
使用 String.format() (格式化转换)
当你需要按照特定格式将其他类型转换为字符串时,String.format() 是一个非常强大的选择,它类似于 C 语言中的 printf。
特点:
- 格式化输出:可以控制数字的精度、宽度、对齐方式等。
- 可读性好:格式化字符串清晰明了。
示例代码:
int num = 100;
double price = 99.987;
String str1 = String.format("Number: %d", num); // 结果: "Number: 100"
String str2 = String.format("Price: %.2f", price); // 结果: "Price: 99.99" (保留两位小数)
String str3 = String.format("Hello, %s! Your score is %d.", "Bob", 95); // 结果: "Hello, Bob! Your score is 95."
String 转换为其他类型 (Convert from String)
将字符串转换为其他类型时,最核心的问题是处理可能出现的格式错误,将字符串 "abc" 转换为整数 int 就会失败。
使用包装类的 parseXxx() 或 valueOf() 方法 (最常用)
每个基本数据类型(int, long, double, boolean 等)都有一个对应的包装类(Integer, Long, Double, Boolean 等),这些包装类提供了静态方法来解析字符串。
parseXxx(String s): 将字符串解析为对应的基本数据类型,如果字符串格式不正确,会抛出NumberFormatException。valueOf(String s): 将字符串解析为对应的包装类对象,内部也是调用parseXxx(),如果字符串格式不正确,同样会抛出NumberFormatException。
特点:
- 标准方法:这是进行类型转换的标准做法。
- 必须处理异常:调用时必须用
try-catch包裹,或者确保字符串格式绝对正确,否则程序会崩溃。
示例代码:
String strNum = "123";
String strBool = "true";
String strDouble = "3.14";
String strInvalid = "abc";
// String -> int (基本类型)
int num = Integer.parseInt(strNum); // 结果: 123
// int num2 = Integer.parseInt(strInvalid); // 抛出 NumberFormatException
// String -> Integer (包装类对象)
Integer integerObj = Integer.valueOf(strNum); // 结果: 123 (Integer对象)
// String -> boolean
boolean flag = Boolean.parseBoolean(strBool); // 结果: true
// 注意: Boolean.parseBoolean 对非 "true" (不区分大小写) 的字符串都返回 false
boolean flag2 = Boolean.parseBoolean("false"); // 结果: false
boolean flag3 = Boolean.parseBoolean("TRUE"); // 结果: true
boolean flag4 = Boolean.parseBoolean("yes"); // 结果: false
// String -> double
double d = Double.parseDouble(strDouble); // 结果: 3.14
处理带 null 或空字符串的情况
直接调用 parseXxx() 在遇到 null 或空字符串 时也会抛出异常,在实际开发中,优雅地处理这些情况非常重要。
最佳实践:
- 检查
null:在转换前,先判断字符串是否为null。 - 检查空字符串:使用
isEmpty()或length() == 0检查。 - 提供默认值:当转换失败时,可以返回一个预设的默认值。
示例代码(安全转换):
public class SafeConverter {
public static int safeParseInt(String str, int defaultValue) {
if (str == null || str.trim().isEmpty()) {
return defaultValue;
}
try {
return Integer.parseInt(str.trim()); // 去除首尾空格是个好习惯
} catch (NumberFormatException e) {
return defaultValue;
}
}
public static void main(String[] args) {
String s1 = " 100 ";
String s2 = "abc";
String s3 = "";
String s4 = null;
System.out.println(safeParseInt(s1, -1)); // 输出: 100
System.out.println(safeParseInt(s2, -1)); // 输出: -1 (默认值)
System.out.println(safeParseInt(s3, -1)); // 输出: -1 (默认值)
System.out.println(safeParseInt(s4, -1)); // 输出: -1 (默认值)
}
}
使用 Number 类的 doubleValue() 等方法
Integer, Long, Double, Float 等数值包装类都继承自 Number 类,你可以先将字符串解析为 Number 对象,然后再获取你需要的具体类型。
特点:
- 灵活性:当你不确定字符串是整数还是浮点数时,可以先解析为
Double或BigDecimal。
示例代码:
String strNum = "123.45"; // 先解析为 Double Number number = Double.parseDouble(strNum); // 再获取不同类型的值 int intValue = number.intValue(); // 结果: 123 (会丢失精度) long longValue = number.longValue(); // 结果: 123 double doubleValue = number.doubleValue(); // 结果: 123.45
总结与最佳实践
| 转换方向 | 方法 | 推荐度 | 关键点 |
|---|---|---|---|
| 其他类型 -> String | String.valueOf() |
⭐⭐⭐⭐⭐ (最推荐) | 通用、安全,处理 null 不会报错。 |
| 拼接 | ⭐⭐⭐ | 直观,但循环中性能差。 | |
toString() |
⭐⭐ | 面向对象,但 null 不安全,且可能需要重写。 |
|
String.format() |
⭐⭐⭐⭐ | 格式化,适合需要格式输出的场景。 | |
| String -> 其他类型 | 包装类 parseXxx() |
⭐⭐⭐⭐⭐ (最推荐) | 标准方法,但必须处理 NumberFormatException。 |
包装类 valueOf() |
⭐⭐⭐⭐ | 返回包装类对象,同样需要处理异常。 | |
| 安全转换 | try-catch + 默认值 |
⭐⭐⭐⭐⭐ | 生产环境必备,优雅地处理 null、空串和格式错误。 |
核心建议:
- 将其他类型转为 String:优先使用
String.valueOf()。 - 将 String 转为其他类型:优先使用包装类的
parseXxx()方法,并用try-catch块来捕获可能的NumberFormatException。 - 处理
null和空字符串:在转换前进行检查,这是健壮代码的关键,可以封装自己的工具方法来简化这个过程。
