(转自:http://www.cnblogs.com/xudong-bupt/p/3961159.html)

java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题。现在总结一下,看看他们的不同与相同。

1.可变与不可变

  String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。

    private final char value[];

  StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。

    char[] value;

2.是否多线程安全

  String中的对象是不可变的,也就可以理解为常量,显然线程安全

  AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

  StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码:

 public synchronized StringBuffer reverse() {
super.reverse();
return this;
} public int indexOf(String str) {
return indexOf(str, 0); //存在 public synchronized int indexOf(String str, int fromIndex) 方法
}

StringBuilder并没有对方法进行加同步锁,所以是非线程安全的

 3.StringBuilder与StringBuffer共同点

  StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。

  抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。

  StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。

  最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。

最新文章

  1. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之 Http 请求客户端
  2. runtime的黑魔法
  3. Java 之 多线程编程
  4. Markdown语法速查
  5. [ML] Naive Bayes for email classification
  6. [Spring] spring-session + JedisPool 实现 session 共享
  7. 第九章 C语言在嵌入式中的应用
  8. Highcharts-3.0.6
  9. QEvent大全,有中文解释
  10. C Socket Programming for Linux with a Server and Client Example Code
  11. Android bluetooth介绍(四): a2dp connect流程分析
  12. 【转】聊聊HTTPS和SSL/TLS协议
  13. JavaScript设计模式_02_策略模式
  14. 解决外部编辑器修改Eclipse文件延迟刷新【补充】
  15. Python数据分析工具
  16. dmraid 用法
  17. python学习笔记之自定义函数的导入
  18. 不平衡学习 Learning from Imbalanced Data
  19. centos 打包报错License for package Android SDK Build-Tools 25.0.3 not accepted
  20. ETL化的IOTA架构

热门文章

  1. Linux删除文件后空间不释放
  2. leetcode 889. Spiral Matrix III
  3. castle windsor学习-----Registering components by conventions
  4. 测试CPU核心个数
  5. List 中去除 null 方法讨论
  6. kaggle 欺诈信用卡预测——不平衡训练样本的处理方法 综合结论就是:随机森林+过采样(直接复制或者smote后,黑白比例1:3 or 1:1)效果比较好!记得在smote前一定要先做标准化!!!其实随机森林对特征是否标准化无感,但是svm和LR就非常非常关键了
  7. Linux学习过程中的简单命令
  8. hadoop_学习_01_入门准备
  9. python实现列队
  10. mci播放mp3