好程序员java教程分享+号与append的效率问题,前言:java 对于初学Java的人来讲,在学习String的时候,确定有无数我的和咱们讲过,”尽可能不要使用+拼接字符串,效率很差,应该使用append “,但真相真的是这样的吗?下面咱们来经过实际代码来测试一下+号与append的效率问题。程序员 代码分析
咱们分别在循环中分别用+好和append来循环拼接字符串。分别打印出他们的时间: 编译,运行结果以下: 咱们能够发现效率确实差距很是的明显。别急,下面咱们继续来经过javap命令来查看他的字节码文件指令: 咱们能够发现使用+号拼接字符串,在循环体立面每次都会new一个StringBuilder对象,而后调用append方法来追加字符串。 下面咱们看一下使用append拼接的字节码指令: 综上咱们能够发现,在循环体里面咱们使用+号拼接字符串的时候,编译器每次都会给咱们建立一个Stringbuilder对象,这也正是再循环体里面使用+号性能差的根本缘由。难道这就能够说明咱们永远都不要使用+号来拼接字符串了嘛?其实这是不彻底正确的。下面咱们再来一组测试: 测试代码:
咱们能够经过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了新技能没? |
咱们分别在循环中分别用+好和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了新技能没?