我的极客虫blog

The only easy day was yesterday.

  • 首页
  • 归档

  • 搜索
RxJava 内存 GreenDAO Tools Mac 设计模式 Gradle Java Life Android Studio WebView SDK Service 规范 Android

Java中String、StringBuffer及StringBuilder的区别

发表于 2016-11-17 | 分类于 理.理论学习 | 0 | 阅读次数 103

最近在reviews公司项目代码的时候,发现自己三个月前写的代码效率不高,所以都一一去优化,在优化到部分涉及到字符串拼接的问题上时,发现自己以前都没注意到效率,都是String直接拼接,所以就研究下字符串拼接的效率。

String介绍

从官网介绍中可看到String是字符串常量,字符串长度不变,它是不可变的。
在使用String主要注意的几点:

  1. String类初始化后是不可变的
  2. 使用String不一定创建对象
  3. 使用new String,一定创建对象

StringBuffer介绍

从官网介绍中可看到StringBuffer是线程安全的可变字符序列,在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
操作上提供append和insert方法,append方法是将字符添加到缓冲区的末端,而insert方法则能在指定的点添加字符。

StringBuilder介绍

从官方介绍知道StringBuilder是一个可变的字符序列,线程是不安全的,速度相较于StringBuffer要更快些。

使用

  1. 如果要操作少量的数据,用String;
  2. 单线程操作大量数据,用StringBuilder;
  3. 多线程操作大量数据,用StringBuffer;
  4. 不要使用String的“+”来进行多次拼接,因为性能很差,应该使用StringBuffer或StringBuilder类;
  5. 为了获得更好的性能,在构造StringBuffer或StringBuilder时应尽可能指定它们的容量,默认构造容量为16个字符;
  6. StringBuilder使用在方法内部来完成类似“+”功能,因为是线程不安全的,所以用完以后可以丢弃掉,StringBuffer主要用在全局变量中;

区别

  1. 可变与不可变
    String类中使用字符数组保存字符串,private final char value[]中因为有‘final’修饰符,所以String对象是不可变的。
    StringBuilder与StringBuffer都继承AbstractStringBuilder类,char[] value可见在AbstractStringBuilder中也是使用字符数组保存字符串,所以这两种对象都是可变的。
  2. 是否多线程安全
    String中的对象是不可变的,显然线程安全。
    StringBuffer对方法加了同步锁,所以是线程安全。
    StringBuilder并没有对方法进行加同步锁,所以是非线程安全。
  3. StringBuilder与StringBuffer共同点 StringBuilder与StringBuffer同继承AbstractStringBuilder。共同有公共方法,只是StringBuffer会在方法上加synchronized进行同步。
    如果程序不是多线程的,使用StringBuilder效率高于StringBuffer。
如果这篇文章对您有很大帮助,你可以扫描下面的二维码,让我喝一杯咖啡。非常感谢您的捐赠。谢谢!
F1ReKing 微信支付

微信支付

F1ReKing 支付宝

支付宝

  • 本文作者: F1ReKing
  • 本文链接: https://geekbug.xyz/archives/2019120223151234854
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# RxJava # 内存 # GreenDAO # Tools # Mac # 设计模式 # Gradle # Java # Life # Android Studio # WebView # SDK # Service # 规范 # Android
iterm2设置代理
Android中的“再按一次返回键退出程序”的改进
  • 文章目录
  • 站点概览
F1ReKing

F1ReKing

34 日志
8 分类
15 标签
RSS
Github E-mail Twitter
Creative Commons
Links
  • Android开发者
0%
© 2014 — 2021 F1ReKing
The only easy day was yesterday.
闽ICP备20002060号