+ 除了表示基本数据的加法计算之外,也可用作字符串连接操作符,任何类型都可以和字符串使用+来合并为一个新的字符串。
这种连接方式比较简单,对于较小的对象比较合适。但在大规模场景中,这样的做法并不合适。
为连接 n 个字符串而重复使用+操作符,需要n的平方级的时间。这是由于字符串是不可变的,每次操作都是拷贝他们的内容,合并到一个新的 String 实例中。
虽然较新的 jdk 可以自动优化部分场景,但只局限在能够推断和优化的场景下。
比如
String aa = "gu"+"vvu";
此代码因为是编译时就可以确认最终内容,所以会被优化为 String aa = "guvvu";
同时,在无法直接获得最终内容时,+ 操作会被优化为StringBuilder
比如
String ss = s1 + s2+s3;
会被优化为
String ss = new StringBuilder().append(s1).append(s2).append(s3).toString();
但自动优化能做的毕竟是有限的,有些场景是无法被自动优化的,这时候需要手动来处理,避免频繁使用+操作。比如循环中
String ss = "";
if(!strs.isEmpty){
for(String s: strs){
if(ss.isEmpty()){
ss = s;
}else{
ss = ss +","+s;
}
}
}
此代码无法被完美优化,只能被优化为
String ss = "";
if(!strs.isEmpty){
for(String s: strs){
if(ss.isEmpty()){
ss = s;
}else{
ss = new StringBuilder().append(ss).append(",").append(s).toString();
}
}
}
其实这里,我们可以手动优化到更好,这种做法的性能在循环次数越多时,比上面的办法性能优势越大。
StringBuilder sb = new StringBuilder();
if(!strs.isEmpty()){
for(String s: strs){
if(sb.length()==0){
sb.append(s);
}else{
sb.append(",").append(s);
}
}
}
最后,+自动优化是jdk 提供优化的,但并不是标准,所以不存在一定会优化,也不一定会优化到什么程度,所以,把自己代·码写好才是最根本的。