面试的时候经常问到的一个题:这里先说明下三者在JVM中的执行速度:StringBuilder > StringBuffer > String,原因且看下面慢慢阐述。

  首先看一个概念,为啥一个是常量,另外两个是变量,详细可见JDK中源码的修饰符。

  String:字符串常量

  StringBuilder:字符串变量

  StringBuffer:字符串变量

  首先看一段简单的代码:这段代码看似简单,实际上很多人不懂JVM执行的原理,首先JVM创建了str的对象,并赋予了"abc"的值,而后再次创建一个新的str的对象,并由原先的str对象拼接上 "d",最终赋值为"abcd",而原先的str的对象则被垃圾回收掉了。看JDK的源码可知,String类的修饰符是final的,所以对象是无法被修改的,因此每次对String对象的切割,拼接等操作,实际上new出了很多对象,所以这样的原因导致了操作String的速度变慢。

String str = "abc";
str = str + "d";

  但StringBuilder和StringBuffer不一样,他们是字符串变量,是可变的对象,每次对他们的操作都是在一个对象上操作的,所以速度自然就变快了。

  

  StringBuilder和StringBuffer的比较:

  StringBuilder是线程不安全的,而StringBuffer是线程安全的。何为线程安全?

  线程安全:如果你的程序是一个进程中运行的,而该进程中跑着多个线程,并且可能同时操作该部分相同的程序,若每次运行的结果和单线程执行的结果相同,并且变量值和预       期的结果也是相同的,那么称之为线程安全。

  

  结论

  对三者的使用建议如下:对少量的字符串数据操作使用String

             单线程场景下操作大量的字符串数据使用StringBuilder,因为速度最快。

               多线程场景下操作大量的字符串数据使用StringBuffer,因为线程安全。

最新文章

  1. 一个人的 ClojureScript 技术栈
  2. ACM Color the fence
  3. 洛谷 P1025 数的划分 Label:dp
  4. javascript操作注册表
  5. nuget的使用总结
  6. 靓号正则表达式(前后向查找等) 和 apache正则包使用
  7. Coding girl一个老程序员谈到的一个女程序员的故事
  8. Web Service和ISAPI的区别与联系 转
  9. 我的mysql数据库sql优化原则
  10. Android入门——电话拨号器和4种点击事件
  11. 33、Python.Unix和Linux系统管理指南.(美)基弗特
  12. ACM学习之路__HDU 1045
  13. swift-UIPickerView(选择控件)
  14. 【C++ Primer | 07】常用算法
  15. 下载 rpm 源码包并重新编译
  16. Nginx ACCESS阶段 统一的用户权限验证系统
  17. format 用法及对齐
  18. POJ.2454.Jersey Politics(随机化算法)
  19. 【Linux技术】linux库文件编写·入门
  20. unittest数据驱动

热门文章

  1. Hadoop2.x Yarn作业提交(客户端)
  2. 关于CSS 里的_width是什么意思???
  3. Unity Shaders and Effects Cookbook (3-5) 金属软高光
  4. Echarts中axislabel文字过长导致显示不全或重叠
  5. ASP.NET操作Excel(终极方法NPOI)
  6. HDU4417 (Super Mario)
  7. Eclipse 安装更多版本SDK
  8. 【BZOJ2565】最长双回文串 Manacher
  9. docker-compose安装elasticsearch集群
  10. 通过SSH连接mysql