从头认识java-11.2 "+"与StringBuilder
来源:互联网 发布:网络大电影平台有哪些 编辑:程序博客网 时间:2024/06/10 10:17
这一章节我们来讨论一下字符串里面的"+"与StringBuilder。
1.例子
package com.ray.ch11;public class Test {public static void main(String[] args) {String a = "a" + "b" + "c";String d = a + "d";}}
我们在这里使用java的一个分析程序的命令javap来看一下class里面究竟是怎么执行的?
大家注意红框里面的两句:
(1)编译器为“a”+"b"+"c"进行了优化,直接变成了"abc"
(2)第二句是来源于a+"d",它首先new一个StringBuilder出来,然后再进行相加,这个也是编译器优化的结果。
但是,对于这种编译器的优化,也是有限度的,而且在某种情况反而是累赘。
2.性能对比测试
我们下面给出的例子,就是对比“+”与StringBuilder之间性能的问题。
使用“+”:
package com.ray.ch11;public class Test {public static void main(String[] args) {String a = "";long startTime = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {a += "a";}long endTime = System.currentTimeMillis();System.out.println(endTime - startTime);}}
输出:
20031
使用StringBuilder:
package com.ray.ch11;public class Test {public static void main(String[] args) {StringBuilder sb = new StringBuilder();long startTime = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {sb.append("a");}long endTime = System.currentTimeMillis();System.out.println(endTime - startTime);}}
输出:
16
对比两者的输出,得出非常悬殊的比较结果,就是使用”+“的性能远远的低于使用StringBuilder。
为什么?
我们来看下面两幅图:
下图是第一组代码的javap图:
上面描述的是循环100000遍,然后红框的地方就是new了100000次,每一次new都耗费大量的时间,因此,时间非常的长。
下图是第二组代码的javap图:
红框里面的代码,只是new了一次StringBuilder,下面的都是一直在这个对象上面append字符串,因此大大减少了执行的时间。
结论:
(1)大部分的情况下,编译器都会为我们的字符串进行优化
(2)在某些极端的情况下,编译器的优化则是会出现性能的问题。
(3)使用”+“,在编译器看来只是使用Stringbuilder而已。
总结:这一章节简单介绍了"+"与StringBuilder,并对两者进行了性能的对比。
---------------------------------------------分割线-------------------------------------------------
首先感谢沉默王二 提出宝贵的意见。
鉴于有读者提出上面的测试场景有不妥的地方,我在这里做出解释:
就一般的情况来说,我们通常都会使用+号来连接字符串,但是对于极端情况(例如上面的多字符串相加),就必须使用stringbuilder了。
上面的测试只是证明了在极端情况下stringbuilder比+号来的性能好。
这一章节就到这里,谢谢。
-----------------------------------
目录
- 从头认识java-11.2 "+"与StringBuilder
- 从头认识java-9.13 foreach与迭代器
- 从头认识java-目录
- 从头认识java-1.7 单根继承与集合
- 从头认识java-4.1 创建与初始化对象
- 从头认识java-6.6 final(4)-类与忠告
- 从头认识java-6.7 初始化与类的加载
- 从头认识java-7.1 抽象类与抽象方法
- 从头认识java-7.8 接口与工厂模式
- 从头认识java-8.4 内部类与向上转型
- 从头认识java-9.4 List的简介与性能
- 从头认识java-9.12 接口Collection与Iterator
- 从头认识java-13.8 类型擦除的问题与解决
- 从头认识java-14.1 再次对比数组与容器
- 从头认识java-15.7 Map(7)-TreeMap与LinkedHashMap
- 从头认识java-1.6 多态
- 从头认识java-4.4 this
- 从头认识java-7.2 接口
- 一个叫支付的宝宝的忧伤
- Activity的启动模式
- FileNet创建application spaces、In-Basket手册
- LeetCode_Best Time to Buy and Sell Stock II
- 03Ehcache中储存缓存的方式
- 从头认识java-11.2 "+"与StringBuilder
- Python日期时间表示
- android框架搭建——封装一个属于自己的数据存储工具类(sharedPreferences篇)
- 南大软院大神养成计划——第十五天
- 汉诺塔
- 程序创建明细表并添加自定义的参数列
- Android 控件之单选框(Toast)
- 蓝桥杯 ALGO-124 算法训练 数字三角形 的两种算法
- [LeetCode] Letter Combinations of a Phone Number