剖析JDK源码-StringBuilder-(5)
一、简述
对比StringBuffer源码:点击链接跳转 会发现StringBuilder 就是一个进化的StringBuffer。
- StringBuilder 类在 Java 5 中被提出,在解决了能随便修改字符串的值问题后,开发者又发现处理大量字符时,速度不太理想。所以就有了StringBuilder 这样的兄弟。
- StringBuilder 和StringBuffer一样能够被多次的修改,并且不产生新的未使用对象。
- 但和StringBuffer不同的是,StringBuilder 线程是不安全的,因为涉及到数组扩容,容易产生脏数据,破坏数据正确性。。
- 所以我们在使用的时候可以分情况使用;(要求速度而不需要考虑线程安全下则选用StringBuilder ;要求线程安全则只能选用StringBuffer)
二、源码
- 看完StringBuffer后可以说,StringBuilder和StringBuffer的属性方法都一样,只是StringBuilder没有synchronized关键字修饰,也因此线程是不安全的。
- 那StringBuilder的速度快在哪里呢?
当然也是在synchronized关键字上,也就是说StringBuffer需要执行同步的操作指令,而StringBuilder不需要执行同步的操作指令;(当你还在等待另一个线程同步时,我已经执行完了,就是这么简单的理解) - 速度从快到慢:StringBuilder >StringBuffer >String
- 由前面也可以知道,StringBuilder是用于单线程的;所以要根据开发需要来选择更优的容器。
常见面试题
1、分别举例说一下在哪些场景下使用哪种对象?
(1)使用String类的场景:在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算。
(2)使用StringBuffer类的场景:在频繁进行字符串运算(如拼接、替换和删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。
(3)使用StringBuilder类的场景:在频繁进行字符串运算(如拼接、替换和删除等),并且运行在单线程的环境中,则可以考虑使用StringBuilder,如SQL语句的拼装、JSON封装等。