- 类型转换:从一个非
String对象(如Integer,Date等)转换成一个String对象。 - 格式化/重新构造:从一个已有的
String对象,通过特定的格式或规则,生成一个新的String对象。 - 编码转换:将一个
String对象(它内部存储的是 Unicode 字符)按照某种编码(如 GBK)转换成字节数组,然后再从这些字节数组按照另一种编码(如 UTF-8)重新构建一个新的String对象。
下面我将针对这几种常见的情况,详细讲解在 Java 中如何实现。

从其他类型(非 String)转换为 String
这是最常见的“字符串转换”场景,Java 提供了多种方法来完成这个任务。
使用 String.valueOf() (推荐)
这是最常用、最安全的方法,它是一个静态方法,可以接受各种类型的参数(包括基本数据类型和对象),并将其转换为字符串。
优点:
- 对
null值非常友好,如果传入null,它会返回字符串"null",而不会抛出NullPointerException。 - 重载了多种基本数据类型,效率高。
示例:

int number = 123; String str1 = String.valueOf(number); // 结果: "123" double decimal = 99.99; String str2 = String.valueOf(decimal); // 结果: "99.99" boolean flag = true; String str3 = String.valueOf(flag); // 结果: "true" Object obj = null; String str4 = String.valueOf(obj); // 结果: "null" (不会报错)
使用对象的 .toString() 方法
几乎所有 Java 对象都继承自 Object 类,而 Object 类中有一个 toString() 方法,你可以直接调用任何对象的 toString() 方法来获取其字符串表示形式。
注意:
- 对于基本数据类型(
int,double等),不能直接调用.toString(),需要先将它们包装成对应的对象(如Integer,Double)。 - 如果对象是
null,直接调用null.toString()会抛出NullPointerException。
示例:
Integer numberObj = 123; String str1 = numberObj.toString(); // 结果: "123" Object obj = null; // String str2 = obj.toString(); // 这行会抛出 NullPointerException! // 对于基本类型,需要先装箱 int number = 456; String str3 = Integer.valueOf(number).toString(); // 结果: "456"
使用空字符串拼接 (简单但不够优雅)
你可以将任何类型与一个空字符串 用 号连接起来,Java 会自动调用其 toString() 方法。

示例:
int number = 789; String str1 = "" + number; // 结果: "789" Object obj = new Object(); // 假设 obj 是某个类的实例 String str2 = "" + obj; // 结果: "java.lang.Object@1b6d3586" (对象的默认字符串表示)
这种方法虽然简单,但在性能敏感的代码中(例如在循环中),频繁创建 StringBuilder 可能会影响效率。
使用 String.format() (用于格式化转换)
当你需要将其他类型按照特定格式转换为字符串时,String.format() 是最佳选择,它类似于 C 语言中的 printf。
示例:
int number = 100;
String str1 = String.format("数字是: %d", number); // 结果: "数字是: 100"
double price = 19.99;
String str2 = String.format("价格: %.2f 元", price); // 结果: "价格: 19.99 元"
从一个 String 生成一个新的 String (格式化/构造)
这种情况通常指从一个已有的字符串,通过处理(如截取、替换、拼接)得到一个新的字符串。
使用 或 运算符 (拼接)
这是最简单的字符串拼接方式,但请注意,在 Java 中,String 是不可变的,每次使用 拼接字符串时,JVM 都会在底层创建一个新的 String 对象,这可能会在循环中造成性能问题。
示例:
String s1 = "Hello"; String s2 = "World"; String s3 = s1 + ", " + s2 + "!"; // 结果: "Hello, World!"
使用 StringBuilder 或 StringBuffer (高效拼接)
对于大量的字符串拼接操作,强烈推荐使用 StringBuilder(非线程安全,性能更高)或 StringBuffer(线程安全,性能稍低),它们在内存中维护一个可变的字符序列,避免了频繁创建新对象。
示例:
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(", ");
sb.append("World");
sb.append("!");
String newString = sb.toString(); // 结果: "Hello, World!"
使用 String.format() (格式化)
和情况一类似,它也可以用来构造格式化的新字符串。
示例:
String name = "张三";
int age = 30;
String info = String.format("姓名: %s, 年龄: %d", name, age); // 结果: "姓名: 张三, 年龄: 30"
使用 substring() (截取)
从原字符串中提取一部分内容生成新字符串。
示例:
String original = "Hello, Java World!"; String sub = original.substring(7, 11); // 结果: "Java" (包含索引7,不包含索引11)
String 编码转换
一个 String 对象在 Java 虚拟机内部总是以 Unicode 编码存储,但在与外部世界(如文件、网络、数据库)交互时,通常需要将其转换为特定的字节编码(如 UTF-8, GBK)。
从 String 到字节数组 (指定编码)
使用 String.getBytes(Charset charset) 方法。
示例:
String text = "你好,世界!";
// 将字符串转换为 UTF-8 编码的字节数组
byte[] utf8Bytes = text.getBytes(StandardCharsets.UTF_8);
// 将字符串转换为 GBK 编码的字节数组
byte[] gbkBytes = text.getBytes("GBK"); // 需要处理 UnsupportedEncodingException
从字节数组到 String (指定编码)
使用 new String(byte[] bytes, Charset charset) 构造方法。
示例:
byte[] utf8Bytes = { -28, -72, -83, -27, -101, -67, -28, -70, -83, -26, -107, -116, -24, -81, -107, -25, -107, -116 }; // "你好"的UTF-8编码
// 从UTF-8字节数组重新构建字符串
String fromUtf8 = new String(utf8Bytes, StandardCharsets.UTF_8); // 结果: "你好"
byte[] gbkBytes = { -60, -29, -70, -61 }; // "你好"的GBK编码
// 从GBK字节数组重新构建字符串
String fromGbk = new String(gbkBytes, "GBK"); // 结果: "你好"
总结与最佳实践
| 场景 | 推荐方法 | 示例 |
|---|---|---|
| 将基本类型或对象转为 String | String.valueOf() |
String.valueOf(123) |
调用非空对象的 toString() |
object.toString() |
"123".toString() |
| 格式化转换 | String.format() |
String.format("Num: %d", 100) |
| 简单字符串拼接 | 运算符 | "a" + "b" |
| 大量/循环字符串拼接 | StringBuilder |
new StringBuilder().append("a").append("b") |
| 字符串编码转换 | String.getBytes(charset) 和 new String(bytes, charset) |
s.getBytes(StandardCharsets.UTF_8) |
核心要点:
- 转换:优先使用
String.valueOf(),因为它安全且能处理null。 - 构造:复杂构造用
String.format(),高效拼接用StringBuilder。 - 编码:始终明确指定字符集(如
StandardCharsets.UTF_8),避免使用平台默认编码,以防止乱码。
