欢迎大家来到IT世界,在知识的湖畔探索吧!
写在前面:
视频是什么东西,有看文档精彩吗?
视频是什么东西,有看文档速度快吗?
视频是什么东西,有看文档效率高吗?
1. StringBuilder
张小飞:StringBuilder是什么?
诸小亮:StringBuilder 跟 StringBuffer 的用法一样,但是效率稍微高一些
张小飞:哦?这是为什么?
诸小亮:你看看下面的测试结果
public static void main(String[] args) throws Exception {
//获取当前时间的毫秒值
long l = System.currentTimeMillis();
StringBuffer str = new StringBuffer();//使用StringBuffer,append 一千万次
for(int i = 0;i<10000000;i++){
str.append(i);
}
System.out.println(System.currentTimeMillis() - l);
}
欢迎大家来到IT世界,在知识的湖畔探索吧!
结果:
欢迎大家来到IT世界,在知识的湖畔探索吧!public static void main(String[] args) throws Exception { //获取当前时间的毫秒值 long l = System.currentTimeMillis(); StringBuilder str = new StringBuilder();//使用StringBuilder,append 一千万次 for(int i = 0;i<10000000;i++){ str.append(i); } System.out.println(System.currentTimeMillis() - l);}
结果:
张小飞:明白了,不过既然用法一样,为什么搞两个类呢?只用StringBuilder不就行了
诸小亮:问得好,这是因为 StringBuffer 是在早期的JDK版本种就推出了,而 StringBuilder 是JDK5 才推出的
张小飞:原来是这样,那为什么 StringBuilder 效率要高呢?
诸小亮:因为他们两个是有区别的
- StringBuffer:是线程同步的,多线程操作是安全的
- StringBuilder:非线程同步,多线程操作不安全,但是单线程下效率高于StringBuffer
张小飞:StringBuffer 是线程安全的?
诸小亮:是的,因为StringBuffer所有方法都是同步方法
张小飞:原来如此,就是因为同步,导致 StringBuffer 效率相对来说比 StringBuilder 低一些
诸小亮:是的,不过因为在 JDK 1.6 ,synchronized 进行了升级,所以它们的差别现在很小
2. 优化
张小飞:您之前说,两个 String 之间,用 + 连接时,进行了一些优化,什么样子的优化?
诸小亮:一共分 3 种,我们一个个看
1. 静态字符串相加
诸小亮:静态字符串相加,比如:
在编译为 class 文件时,就已经做了优化
张小飞:什么样子的优化?
诸小亮:双击打开 class 文件,就可以看到效果了
张小飞:明白了
2. 变量相加的优化
张小飞:那么第二种呢?
诸小亮:第二种是变量相加,比如;
张小飞:这种是???
诸小亮:在JDK5——JDK8的时候,会创建一个 StringBuilder 对象,相当于
String s2 = new StringBuilder(s).append("貂蝉").append("吕布").toString();
张小飞:原来如此,明白了
诸小亮:但是 JDK9 的时又进行了修改,使用 StringConcatFactory 的 makeConcatWithConstants 方法
张小飞:这个进行了怎样的优化?
诸小亮:这个。。。,很抱歉,目前并不知道它是如何优化的,暂时作为了解吧
张小飞:好吧,那我们现在是 JDK11 还有优化?
诸小亮:没有了,JDK11 跟 JDK9 一样
3. 循环相加
张小飞:第三种呢?
诸小亮:其实第三种跟第二种类似
张小飞:您的意思是,s2 += i,也是用了StringBuilder对象?,相当于
欢迎大家来到IT世界,在知识的湖畔探索吧!String s2 = new StringBuilder(s).append("i");
诸小亮:没错,你领悟的还挺快
张小飞:哈哈,不过,这样不是每一次循环都会创建一个 StringBuilder 对象吗?
诸小亮:是的,所以遇到这种情况,还是建议在 for 循环的外面创建一个 StringBuilder 对象
张小飞:明白了
诸小亮:另外,JDK9之后,这种也是使用 StringConcatFactory 的 makeConcatWithConstants 方法
张小飞:了解
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/32443.html