博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
好程序员java教程分享+号与append的效率问题
阅读量:6511 次
发布时间:2019-06-24

本文共 1564 字,大约阅读时间需要 5 分钟。

好程序员java教程分享+号与append的效率问题,前言:

对于初学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了新技能没?

转载于:https://juejin.im/post/5cff6bb351882570ec017400

你可能感兴趣的文章
swoft| 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? docker 了解一下呗~
查看>>
win7 蛋疼的时间格式转化
查看>>
C++中二维数组的动态创建与处理
查看>>
SPOJ 10628 COT - Count on a tree(在树上建立主席树)(LCA)
查看>>
general error c1010070: Failed to load and parse the manifest
查看>>
SpringInAction--Bean参数的自动注入
查看>>
取某个数字的各个位数字
查看>>
素数筛
查看>>
centos /linux 修改目录或文件权限
查看>>
leetcode--
查看>>
访问者模式
查看>>
异步函数
查看>>
jQuery 选择器
查看>>
Openstack的vnc界面定制
查看>>
软考 2018年下半年卷 错题知识点记录
查看>>
仿网易邮箱5.0版UI
查看>>
winsow xp不能安装软件, 提示"中断" 是因为设置了 软件限制策略
查看>>
as3调用外部应用程序 as调用外部exe文件as3调用bat文件 未测试
查看>>
jQuery清空标签内容--防止内存泄露
查看>>
关于 HandlerMethodArgumentResolver 类 以及 WebArgumentResolver 类 自定义解析参数
查看>>