在 Java 中,String 是不可变字符串,StringBuffer 是可变字符串(线程安全),两者的相互转换是开发中常见操作,以下是具体实现方式、示例及注意事项:
一、String 转 StringBuffer
有两种核心方式:构造方法 (推荐)、append() 方法。
1. 构造方法(最简洁)
StringBuffer 提供了接收 String 参数的构造方法,直接创建新的 StringBuffer 对象。
public class StringConvertDemo {
public static void main(String[] args) {
// 原始 String
String str = "Hello Java";
// String 转 StringBuffer(构造方法)
StringBuffer sb = new StringBuffer(str);
System.out.println("转换后的 StringBuffer: " + sb); // 输出:Hello Java
System.out.println("类型:" + sb.getClass().getName()); // 输出:java.lang.StringBuffer
}
}
2. append () 方法(先创建空对象,再追加)
先创建空的 StringBuffer,再通过 append() 方法把 String 内容追加进去。
public class StringConvertDemo {
public static void main(String[] args) {
String str = "Hello World";
// 先创建空 StringBuffer,再追加 String
StringBuffer sb = new StringBuffer();
sb.append(str);
System.out.println("转换后的 StringBuffer: " + sb); // 输出:Hello World
}
}
二、StringBuffer 转 String
有三种常用方式:toString() 方法(推荐)、String 构造方法、substring() 方法。
1. toString () 方法(最推荐)
StringBuffer 重写了 toString() 方法,直接返回对应的 String 对象,效率最高。
public class StringConvertDemo {
public static void main(String[] args) {
// 原始 StringBuffer
StringBuffer sb = new StringBuffer("Hello StringBuffer");
// StringBuffer 转 String(toString())
String str = sb.toString();
System.out.println("转换后的 String: " + str); // 输出:Hello StringBuffer
System.out.println("类型:" + str.getClass().getName()); // 输出:java.lang.String
}
}
2. String 构造方法
通过 String 的构造方法接收 StringBuffer 参数(底层仍调用 toString())。
public class StringConvertDemo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Test Convert");
// String 构造方法转换
String str = new String(sb);
System.out.println("转换后的 String: " + str); // 输出:Test Convert
}
}
3. substring () 方法(截取全部内容)
通过 substring(0, length()) 截取 StringBuffer 的全部内容,返回 String。
public class StringConvertDemo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Substring Demo");
// 截取全部内容转换
String str = sb.substring(0, sb.length());
System.out.println("转换后的 String: " + str); // 输出:Substring Demo
}
}
三、关键注意事项
-
不可变性 vs 可变性:
-
String转换为StringBuffer后,修改StringBuffer不会影响原String; -
StringBuffer转换为String后,生成的String是不可变的,修改原StringBuffer也不会影响该String。// 示例:验证独立性
String str = "Original";
StringBuffer sb = new StringBuffer(str);
sb.append(" Modified"); // 修改 StringBuffer
System.out.println(str); // 输出:Original(原 String 不变)String newStr = sb.toString();
sb.append(" Again"); // 再次修改 StringBuffer
System.out.println(newStr); // 输出:Original Modified(原转换后的 String 不变)
-
-
性能建议:
String转StringBuffer优先用构造方法(少一次追加操作);StringBuffer转String优先用toString()(底层直接获取字符数组,效率最高);- 如果是频繁拼接字符串,建议直接使用
StringBuffer/StringBuilder,避免多次String和StringBuffer互转。
-
线程安全:
StringBuffer是线程安全的,StringBuilder是非线程安全的(效率更高),如果不需要线程安全,建议用StringBuilder替代StringBuffer。