拼接字符串代码段
StringBuffer sb = new StringBuffer();
//java中for循环书写方式:for (循环变量类型 循环变量名称 : 要被遍历的对象) 循环体
//在infos里面进行循环
for(WeatherInfos info : infos)
{
String str = info.toString();
sb.append(str);
sb.append("\n");
}
tv.setText(sb.toString());
你还在循环里面用+号拼接字符串吗?
前言
对于初学Java的人来说,在学习String的时候,肯定有无数个人和我们讲过,”尽量不要使用+拼接字符串,效率不好,应该使用append “,但真相真的是这样的吗?下面我们来通过实际代码来测试一下+号与append的效率问题。
代码分析
public class Demo { public static void main(String[] args){ String str = ""; long start = System.currentTimeMillis(); for(int i=0; i<100000; i++) str += "a"; long end = System.currentTimeMillis(); System.out.println(end - start);
StringBuilder sb = new StringBuilder(); start = System.currentTimeMillis(); for(int i=0; i<100000; i++) sb.append("a"); str = sb.toString(); end = System.currentTimeMillis(); System.out.println(end - start); } } |
我们分别在循环中分别用+好和append来循环拼接字符串。分别打印出他们的时间:
编译,运行结果如下:
我们可以发现效率确实差距非常的明显。别急,下面我们继续来通过javap命令来查看他的字节码文件指令:
我们可以发现使用+号拼接字符串,在循环体立面每次都会new一个StringBuilder对象,然后调用append方法来追加字符串。
下面我们看一下使用append拼接的字节码指令:
综上我们可以发现,在循环体里面我们使用+号拼接字符串的时候,编译器每次都会给我们创建一个Stringbuilder对象,这也正是再循环体里面使用+号性能差的根本原因。难道这就可以说明我们永远都不要使用+号来拼接字符串了嘛?其实这是不完全正确的。下面我们再来一组测试:
测试代码:
public class Test { public static void main(String[] args){ String a = "a"; String b = "a"; String c = "a"; String d = "a"; String e = a + b + c; e += d; } } |
我们可以通过javap命令来查看以上字节码文件的指令如下:我们会发现只帮助我们new了2个StringBuilder对象。我们可以得到如下结论:对于此处的str = str + “a”,编译器会处理为new StringBuilder().append(str).append(“a”),不管一次性+几个字符串,只要+拼接全部在一条语句中,就只会new一次,循环中+拼接被断成了十万条语句,那自然就会new十万次。
总结
我们在循环体中不要使用+号来拼接字符串,使用append来代替,但是不在循环体里面使用+号完全不会影响性能,甚至编译器还做了优化。对于此处的str = str + “a”,编译器会处理为new StringBuilder().append(str).append(“a”),不管一次性+几个字符串,只要+拼接全部在一条语句中,就只会new一次,循环中+拼接被断成了十万条语句,那自然就会new十万次。小伙伴们,你们GET了新技能没?
你还在循环里面用+号拼接字符串吗?
前言
对于初学Java的人来说,在学习String的时候,肯定有无数个人和我们讲过,”尽量不要使用+拼接字符串,效率不好,应该使用append “,但真相真的是这样的吗?下面我们来通过实际代码来测试一下+号与append的效率问题。
代码分析
public class Demo {
public static void main(String[] args){
String str = "";
long start = System.currentTimeMillis();
for(int i=0; i<100000; i++)
str += "a";
long end = System.currentTimeMillis();
System.out.println(end - start);
StringBuilder sb = new StringBuilder();
start = System.currentTimeMillis();
for(int i=0; i<100000; i++)
sb.append("a");
str = sb.toString();
end = System.currentTimeMillis();
System.out.println(end - start);
}
}
我们分别在循环中分别用+好和append来循环拼接字符串。分别打印出他们的时间:
编译,运行结果如下:
我们可以发现效率确实差距非常的明显。别急,下面我们继续来通过javap命令来查看他的字节码文件指令:
我们可以发现使用+号拼接字符串,在循环体立面每次都会new一个StringBuilder对象,然后调用append方法来追加字符串。
下面我们看一下使用append拼接的字节码指令:
综上我们可以发现,在循环体里面我们使用+号拼接字符串的时候,编译器每次都会给我们创建一个Stringbuilder对象,这也正是再循环体里面使用+号性能差的根本原因。难道这就可以说明我们永远都不要使用+号来拼接字符串了嘛?其实这是不完全正确的。下面我们再来一组测试:
测试代码:
public class Test {
public static void main(String[] args){
String a = "a";
String b = "a";
String c = "a";
String d = "a";
String e = a + b + c;
e += d;
}
}
我们可以通过javap命令来查看以上字节码文件的指令如下:我们会发现只帮助我们new了2个StringBuilder对象。我们可以得到如下结论:对于此处的str = str + “a”,编译器会处理为new StringBuilder().append(str).append(“a”),不管一次性+几个字符串,只要+拼接全部在一条语句中,就只会new一次,循环中+拼接被断成了十万条语句,那自然就会new十万次。
总结
我们在循环体中不要使用+号来拼接字符串,使用append来代替,但是不在循环体里面使用+号完全不会影响性能,甚至编译器还做了优化。对于此处的str = str + “a”,编译器会处理为new StringBuilder().append(str).append(“a”),不管一次性+几个字符串,只要+拼接全部在一条语句中,就只会new一次,循环中+拼接被断成了十万条语句,那自然就会new十万次。小伙伴们,你们GET了新技能没?
之前没想过这个问题,比较low,一直用+号拼接字符串。
那么加号拼接和用append方法拼接有啥区别呢?
+号拼接的原理是会在底层new一个StringBuilder,例如:str = str + “a”具体就是new StringBuilder().append(str).append("a");
其实实际上用+号拼接字符串的话,+号用的很少或者只用一个,并且不在循环里面用的话,也是可以的,没什么问题,不存在所谓的效率问题,但是+号不能用在 循环结构里面,如果在循环结构里面,那么每一次循环,+号都会new出来的新的StringBuilder对象,这样就很不好了,非常影响效率。
因此,在拼接字符串的时候,我们尽量用append方法进行拼接,二是防止“高手们”无情的批评和指出错误,一是养成使用append方法的习惯,避免在循环内下意识的用+号进行拼接字符串处理。
有篇文章讲的挺好的,我也是看了之后理解了不少才整理出来的这个。
文章地址是:https://blog.csdn.net/m0_37589327/article/details/78605268
感兴趣的小伙伴可以去看看
拼接字符串代码段
StringBuffer sb = new StringBuffer();
//java中for循环书写方式:for (循环变量类型 循环变量名称 : 要被遍历的对象) 循环体
//在infos里面进行循环
for(WeatherInfos info : infos)
{
String str = info.toString();
sb.append(str);
sb.append("\n");
}
tv.setText(sb.toString());
转载于:https://www.cnblogs.com/baoxiaofei/p/4190348.html