这一章节我们来讨论一下字符串里面的"+"与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--Java String和StringBuilder。
day13-String和StringBuilder 1.String类 1.1字符串的比较【理解】 1.1.1==号的作用 比较基本数据类型:比较的是具体的值 比较引用数据类型:比较的是对象地址值 1.1.2equals方法的作用 方法介绍 示例代码 ...
这是 Chilkat C/C++ Librarybfor MS Visual C++ ...StringBuilder StringTable Tar Task TaskChain TrustedRoots UnixCompress Upload Url WebSocket Xml XmlCertVault XmlDSig XmlDSigGen Xmp Zip ZipCrc ZipEntry
java基础--4.常用类-3.StringBuffer、StringBuilder
简单认识这三个对象 String StringBuffer StringBuilder 深入理解 String、StringBuilder、StringBuffer 从设计角度理解 String StringBuilder StringBuffer StringBuilder 和 StringBuffer 的扩容问题 总结
stringbuilder用法 java中stringBuilder的用法java中stringBuilder的用法java中stringBuilder的用法java中stringBuilder的用法java中stringBuilder的用法java中stringBuilder的用法java中stringBuilder的用法java中...
java8中,编辑器对“+”进行了优化,默认使用StringBuilder进行拼接,所以不用显示的使用StringBuilder了,直接用“+”就可以了。下面我们来详细了解一下
Java 可变字符串 StringBuilder 的 学习 (备注: 如果解压后是乱码,请用普通文本打开,重新复制到对应文件即可)
这是java学习中,总结出来的关于StringBuilder的一些内容,供学习参考。
简单的介绍了String、StringBuffer和StringBuilder的区别
【IT十八掌徐培成】Java基础第10天-02.builder设计模式-StringBuilder-包装类.zip
我们先用一张表格来回顾一下Java中String,StringBuilder,StringBuffer关于值可变性、线程安全性、时间性能排序、常用场景等主要区别。见下表: 数据类型 值可变性 线程安全性 时间性能排名 常用场景 String...
答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类...
什么是Java中的StringBuilder和StringBuffer?它们之间有什么区别? 什么是Java中的Lambda表达式?它的作用和使用场景是什么? 什么是Java中的函数式接口?列举一些常见的函数式接口。 什么是Java中的Stream API...
为什么Java8中不再需要StringBuilder拼接字符串共4页.pdf.zip
java中stringBuilder的用法.pdf
Java中String,StringBuffer与StringBuilder的区别和用法。
NULL 博文链接:https://hui-jing-880210.iteye.com/blog/2173195
从内存方面解释Java中String与StringBuilder的性能差异.docx
刚从java转过来感觉c的字符串操作太麻烦了所以自己写了一个类似java的StringBuilder类的头文件 它支持java的StringBuilder支持的很多操作大大方便了对字符串的操作 能力所限如有bug请指出</h1>