杰瑞科技汇

Java String转String?方法与注意事项解析

  1. 类型转换:从一个非 String 对象(如 Integer, Date 等)转换成一个 String 对象。
  2. 格式化/重新构造:从一个已有的 String 对象,通过特定的格式或规则,生成一个新的 String 对象。
  3. 编码转换:将一个 String 对象(它内部存储的是 Unicode 字符)按照某种编码(如 GBK)转换成字节数组,然后再从这些字节数组按照另一种编码(如 UTF-8)重新构建一个新的 String 对象。

下面我将针对这几种常见的情况,详细讲解在 Java 中如何实现。

Java String转String?方法与注意事项解析-图1
(图片来源网络,侵删)

从其他类型(非 String)转换为 String

这是最常见的“字符串转换”场景,Java 提供了多种方法来完成这个任务。

使用 String.valueOf() (推荐)

这是最常用、最安全的方法,它是一个静态方法,可以接受各种类型的参数(包括基本数据类型和对象),并将其转换为字符串。

优点

  • null 值非常友好,如果传入 null,它会返回字符串 "null",而不会抛出 NullPointerException
  • 重载了多种基本数据类型,效率高。

示例

Java String转String?方法与注意事项解析-图2
(图片来源网络,侵删)
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() 方法。

Java String转String?方法与注意事项解析-图3
(图片来源网络,侵删)

示例

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!"

使用 StringBuilderStringBuffer (高效拼接)

对于大量的字符串拼接操作,强烈推荐使用 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),避免使用平台默认编码,以防止乱码。
分享:
扫描分享到社交APP
上一篇
下一篇