【转载】String、StringBuffer与StringBuilder之间区别
发布日期:2021-08-15 20:52:01 浏览次数:1 分类:技术文章

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

文章原创:

1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String

2.String <(StringBuffer,StringBuilder)的原因

  String:字符串常量

  StringBuffer:字符串变量

  StringBuilder:字符串变量

  从上面的名字可以看到,String是“字符串常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问  ,比如这段代码:

1 String s = "abcd";2 s = s+1;3 System.out.print(s);// result : abcd1

  我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。

  而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。

3.一个特殊的例子:

1 String str = “This is only a” + “ simple” + “ test”;2 StringBuffer builder = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);

  你会很惊讶的发现,生成str对象的速度简直太快了,而这个时候StringBuffer居然速度上根本一点都不占优势。其实这是JVM的一个把戏,实际上:

  String str = “This is only a” + “ simple” + “test”;

  其实就是:

  String str = “This is only a simple test”;

  所以不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的String对象的话,速度就没那么快了,譬如:

  String str2 = “This is only a”;

  String str3 = “ simple”;

  String str4 = “ test”;

  String str1 = str2 +str3 + str4;

  这时候JVM会规规矩矩的按照原来的方式去做。

4.StringBuilder与 StringBuffer

  StringBuilder:线程非安全的

  StringBuffer:线程安全的

  当我们在字符串缓冲区被多个线程使用时,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。

对于三者使用的总结

  1.如果要操作少量的数据用 = String

   2.单线程操作字符串缓冲区下操作大量数据 = StringBuilder

  3.多线程操作字符串缓冲区下操作大量数据 = StringBuffer

关于三者的速度,自己写了个测试代码:

1 package com.wt.others; 2   3 public class StringCompare { 4   5     public static void main(String[] args) { 6         // TODO Auto-generated method stub 7         String text = ""; 8         long beginTime = 0l; 9         long endTime = 0l;10         StringBuffer buffer = new StringBuffer();11         StringBuilder builder = new StringBuilder();12         beginTime = System.currentTimeMillis();13         for(int i=0; i<20000; i++){14             buffer.append(String.valueOf(i));15         }16         endTime = System.currentTimeMillis();17         System.out.println("StringBuffer time is : "+ (endTime - beginTime));18          19         beginTime = System.currentTimeMillis();20         for(int i=0; i<20000; i++){21             builder.append(String.valueOf(i));22         }23         endTime = System.currentTimeMillis();24         System.out.println("StringBuilder time is : "+ (endTime - beginTime));25          26         beginTime = System.currentTimeMillis();27         for(int i=0; i<20000; i++){28             text = text + i;29         }30         endTime = System.currentTimeMillis();31         System.out.println("String time is : "+ (endTime - beginTime));32     }33  34 }

运行结果可以直观的看出:

  StringBuffer time is : 5

  StringBuilder time is : 3
  String time is : 1550

  如果将20000改为100,结果为:

  StringBuffer time is : 1

  StringBuilder time is : 0
  String time is : 1

还是可以直观看出在单线程使用时,StringBuilder速度很快。

转载于:https://www.cnblogs.com/K-artorias/p/7404448.html

转载地址:https://blog.csdn.net/weixin_30779691/article/details/98098223 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:HDU 2042 不容易系列之二
下一篇:云笔记项目- 文件的上传与下载学习

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年03月04日 07时09分57秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java怎么中断阻塞状态_java并发编程()阻塞方法与中断方法 2019-04-21
java zlib 位运算_位运算入门:找出一个二进制数的最右端的第一个1;计算一个二进制数中1的个数;找出数组中唯一一个出现次数为奇数的数;找出数组中唯二两个出现次数为奇数的数... 2019-04-21
java lua热更新_lua热更新学习 2019-04-21
script执行php文件_php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法... 2019-04-21
apache 2.4 php5.4_apache2.4+php5.4+my sql 5.6,网站经常无故不能访问 2019-04-21
php apc.dll下载,PHP之APC缓存详细介绍 apc模块安装 2019-04-21
html贝塞尔曲线在线,贝塞尔曲线的一些事情_html/css_WEB-ITnose 2019-04-21
Java前台显示近20天的东西_第十次课:前台首页设计及显示商品信息 2019-04-21
java开发web网站的路由设计_理解Web路由(浅谈前后端路由与前后端渲染) 2019-04-21
excel如何把顺序倒过来_在excel中怎么使文字颠倒顺序反过来显示呢? 2019-04-21
php正则表达式获取图片路径,php 常用正则表达式实例(图片地址,与指定内容获取)... 2019-04-21
脚本语言php是什么意思,PHP脚本语言 2019-04-21
matlab数学规划模型,数学规划模型 2019-04-21
视频提取音频php,如何提取视频中的音频,从视频文件中提取出音频输出成MP3格式... 2019-04-21
diy.php添加验证码,织梦dedecms自定义表单中加入验证码 2019-04-21
在php脚本中 通过可以获取,在PHP中,可以使用Unix时间戳获取精确的脚本执行时间。... 2019-04-21
s2-045 php exp,S2-045-EXP.py --Struts2任意代码执行漏洞 (S2-045,CVE-2017-5638) 2019-04-21
linux sdk 窗口句柄,Venus: 针对Linux平台上,对常用的系统API进行面向对象的封装SDK。... 2019-04-21
c语言程序设计 科学出版社习题答案,C语言程序设计(科学出版社)第4章 课后习题参考答案.doc... 2019-04-21
c语言 无错 但只运行一半,求哈夫曼编码时程序运行到一半就终止了,编译无错... 2019-04-21