可变性

简单的来说:String 类中使用 final 关键字修饰字符数组来保存字符串,private final char value[],所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的。

StringBuilder 与 StringBuffer 的构造方法都是调用父类构造方法也就是 AbstractStringBuilder 实现的,大家可以自行查阅源码。

AbstractStringBuilder.java

java
abstract class AbstractStringBuilder implements Appendable, CharSequence {
char[] value;
int count;
AbstractStringBuilder() {
}
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
线程安全性

String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

性能

每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

对于三者使用的总结:

操作少量的数据: 适用String
单线程操作字符串缓冲区下操作大量数据: 适用StringBuilder
多线程操作字符串缓冲区下操作大量数据: 适用StringBuffer

免费领取Java精品面试题(面试必遇)

Java面试题:String 和 StringBuffer、StringBuilder 的区别是什么?相关推荐

  1. [JAVA基础类库] String类 ○ StringBuffer类 ○ StringBuilder类

    引言 字符串就是一连串的字符序列,Java提供了String.StringBuffer和StringBuilder三个类来封装对字符串,并提供了系列方法来操作字符串对象. String类是不可变类的: ...

  2. 【面试常问】Java中String和StringBuffer、StringBuilder的区别是什么?

    String和StringBuffer.StringBuilder的区别是什么? 在面试中我们经常会被问到这个问题,包括我自己也掉到坑里了:我就做一个记录分享出来! 文章目录 String和Strin ...

  3. java中的String、StringBuffer和StringBuilder的详细分析

    目录 前言 1. 源码 1.1 String源码 1.2 StringBuffer源码 1.3 StringBuilder源码 2. 总结 前言 java中用于处理字符串常用的主要三个类 在开发中如何 ...

  4. Java中的String、StringBuffer、StringBuilder的区别和使用范围

    String String不可随便更改,把他当做常量就行. 但是String可以通过函数组合或者用format创建可复用的格式化字符串. StringBuffer.StringBuilder 想要多次 ...

  5. java笔试题String字符串单词逆序how are you变成are you how

    今儿去面java,笔试上来六个编程大题也是醉了,两页纸全是英文也是棒棒哒...好多字符串方面的,其实还是挺简单的,但是有些方法感觉有点忘了......总之看面试官看我代码的表情我也是醉了.... 大概 ...

  6. Java面试题 String类能不能被继承?为什么?

    不能,因为string类是被final修饰的类,final修饰过的类不能被继承.final修饰过的变量不能被修改.

  7. 二十一、String、StringBuffer和StringBuilder的区别是什么?

    @Author:Runsen @Date:2020/5/25 大家都知道字符串的不可变的,如果需要对字符串进行修改的时候,那么就需要使用 StringBuffer 和 StringBuilder 类. ...

  8. java stringbuffer长度限制_Java中的String、StringBuffer和StringBuilder

    作为作为一个已经入了门的java程序猿,肯定对Java中的String.StringBuffer和StringBuilder都略有耳闻了,尤其是String 肯定是经常用的.但肯定你有一点很好奇,为什 ...

  9. 吐血整理 这200道阿里P6必备Java面试题,我简直太爱了

    前言 梳理了好久,总算是把面试题全部导出来了,毕竟还要上班,这次就给大家总结了一些Java开发岗位的经典面试题. 篇幅较大,阅读过程中可能会有点繁琐! 但请细细观看,文章末尾有留给大家的小惊喜!!! ...

最新文章

  1. nginx 常用命令 和 配置
  2. 设计模式之创建型模式
  3. 7.0、Android Studio命令行工具
  4. P3387-【模板】缩点【tarjan,强联通分量,DAGdp】
  5. 图书馆管理系统——还书和延期操作
  6. C语言如何处理不定长度参数,C语言中不定参数的实现
  7. 解决思维导图软件Mindmanager Mindjet连接出错
  8. 通过SQL语句删除重复记录
  9. python怎么计算圆上任意两点的距离_圆周上两点距离-python
  10. 【操作基本数据类型的流】
  11. lr_save_var() 截取任意字符串长度,以参数形式输出(参数转变量)
  12. 记忆不可靠,要相信证据:我明明已经提交了
  13. hive循环语句_Hive 如何方便地实现存储过程?
  14. win10设置HTML桌面背景,Win10系统直接将视频设置为桌面背景的方法
  15. mySQL数据库学习的一些心得
  16. Android 7 soter,开通微信人脸支付 OPPO Find X 成首发安卓手机
  17. python绘制折线图怎么样填充空白颜色_两条折线图之间填充颜色
  18. android手机怎么投屏到电视盒子,手机钉钉怎么投屏到电视上
  19. 娃娃机共享扫码平台开发
  20. [转贴]拓展人脉的老派艺术

热门文章

  1. [转载] comma.ai自动驾驶代码浅析及实践
  2. centos7卸载旧jdk安装新jdk1.8
  3. 047 Permutations II 有重复数字的全排列
  4. [妙味Ajax]第三课:AJAX跨域解决方案:JSONP
  5. sip协议的功能及其应用
  6. jupyter notebook + 服务器中docker 使用配置
  7. python 词云 fontpath_Python酷炫词云图原来可以这么玩?
  8. dpf linux安装db2_值得一看!数据库及Mysql入门,附详细安装教程
  9. java面向对象_谈谈Java的面向对象
  10. python3 安装PIL