String,StringBuffer和StringBuilder的区别
面试的时候经常问到的一个题:这里先说明下三者在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,因为线程安全。
最新文章
- 一个人的 ClojureScript 技术栈
- ACM Color the fence
- 洛谷 P1025 数的划分 Label:dp
- javascript操作注册表
- nuget的使用总结
- 靓号正则表达式(前后向查找等) 和 apache正则包使用
- Coding girl一个老程序员谈到的一个女程序员的故事
- Web Service和ISAPI的区别与联系 转
- 我的mysql数据库sql优化原则
- Android入门——电话拨号器和4种点击事件
- 33、Python.Unix和Linux系统管理指南.(美)基弗特
- ACM学习之路__HDU 1045
- swift-UIPickerView(选择控件)
- 【C++ Primer | 07】常用算法
- 下载 rpm 源码包并重新编译
- Nginx ACCESS阶段 统一的用户权限验证系统
- format 用法及对齐
- POJ.2454.Jersey Politics(随机化算法)
- 【Linux技术】linux库文件编写·入门
- unittest数据驱动