Java中字符串的拼接
一、为什么需要注意字符串拼接
String类的内容是不可变的,这意味着每当我们拼接两个字符串时,实际上是创建了一个新的字符串对象,原来的字符串并不会改变,因此,如果拼接操作不当,可能会产生大量临时对象,导致内存的浪费和性能的低下。
二、常见的字符串拼接方式是
1、使用“+”运算符
这是最直观的方法:
常量拼接:
String str="Hello"+" "+"world";
变量拼接:
String a="Hello";
String b="World";
String c=a+" "+b;
编译器会将上面的代码转换为使用StringBuilder的方式,等价于
String c=new StringBuilder().append(a).append(" ").append(b).toString();
在单个语句中编译器会自动优化,但如果在循环中,效率就会很低。
2、使用concat()方法
String res=s1.concat(s2).concat(s3);
concat() 内部会创建一个新的字符数组,复制原字符串和参数字符串的内容,然后返回新字符串的内容,但每次调用依旧创建新对象,只适合少量字符串连接。
3、使用StringBuilder或StringBuffer
StringBuilder和StringBuffer均是可变的字符序列,专门用于构建字符串。
StringBuilder sb=new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String res=sb.toString();
StringBuilder线程不安全,但效率最高,适合单线程;
StringBuffer线程安全,但性能稍差,适合多线程;
循环拼接字符,应选StringBuilder。
StringBulider sb=new StringBuilder();
for(int i=0;i<100;i++){
sb.append(i);
}
String res=sb.toString();
4、使用 String.join()
对于一个数组或集合,想用分隔符连接:
String[]parts={"A","B","C"};
String result=String.join("-",parts);
内部也是通过 StringBuilder 实现的,简洁高效。
5、使用 String.format()
类似于 C 语言的 printf,可以格式化字符串:
String nam ="张三";
int age=25;
String result=String.format("姓名%s,年龄:%d", name, age);
format() 内部也使用了 StringBuilder,但增加了格式解析的开销,适合需要固定模板的场景,不推荐在性能敏感循环中使用。
6、使用 Stream 收集器
List
String result = list.stream().collect(Collectors.joining(","));
Collectors.joining()底层仍然使用 StringBuilder,非常适合集合元素拼接。
三、总结
1、单次拼接或固定少量拼接,用 + 最简洁。
2、循环内动态拼接,必须用 StringBuilder。
3、集合拼接,优先用 String.join() 或 Stream。

浙公网安备 33010602011771号