当前位置:   article > 正文

我的jdk源码(五):StringBuilder 高效可多次修改String_什么情况下会频繁的修改string类型的值

什么情况下会频繁的修改string类型的值

一、概述

    StringBuilder类和StringBuffer类一样,也是我们动态操作字符串常用到的类,jdk1.8中StringBuilder同样继承了父类AbstractStringBuilder类,并且在源码内很多方法都是直接调用的父类AbstractStringBuilder的方法。和 StringBuffer类不同的是,StringBuilder 类的没有了字符缓存数组,成员方法也没有被synchronized关键字修饰,所以StringBuilder是线程不安全的,但是效率会更高,这也是与StringBuffer类最大的区别。 接下来就让我们进入到StringBuffer的源码学习!

二、源码分析

(1) 类的声明,源码如下:

  1. public final class StringBuilder
  2. extends AbstractStringBuilder
  3. implements java.io.Serializable, CharSequence

    如源码所示,StringBuilder类也是被final关键字修饰,为最终类,无法被继承 。StringBuilder类不但继承了AbstractStringBuilder类,还实现了Serializable接口和CharSequence接口。实现Serializable是为了能序列化它的对象,具体在《我的jdk源码(二):String 一个特殊而强大的类!》一文中有详细介绍;实现CharSequence是为了代表该类,或其子类是一个字符序列,具体在《我的jdk源码(三):AbstractStringBuilder类》一文中有详细介绍 。

(2) 成员变量

static final long serialVersionUID = 4383685877147921099L;

    与StringBuffer最大的区别就是成员变量由于不是线程安全的,所以也不需要设置字符缓存,所以没有字符数组toStringCache。

(3) 构造函数

  1. public StringBuilder() {
  2. super(16);
  3. }
  4. public StringBuilder(int capacity) {
  5. super(capacity);
  6. }
  7. public StringBuilder(String str) {
  8. super(str.length() + 16);
  9. append(str);
  10. }
  11. public StringBuilder(CharSequence seq) {
  12. this(seq.length() + 16);
  13. append(seq);
  14. }

    构造函数与StringBuffer几乎一致,都是调用父类构造方法,并且很直观的反映了以下几点:

    *  无参默认创建容量为16的底层数组。

    *  传入字符串时,容量为字符串长度+16。即StringBuilder sb = new StringBuilder("abc");时,sb.length()值为3,sb.capacity()值为19。

    *  传入整数时,则设定容量为参数值 。

(4) toString()方法源码如下:

  1. @Override
  2. public String toString() {
  3. //直接用字符数组new一个新的String对象
  4. return new String(value, 0, count);
  5. }

(5)  writeObject()方法源码如下:

  1. private void writeObject(java.io.ObjectOutputStream s)
  2. throws java.io.IOException {
  3. s.defaultWriteObject();
  4. s.writeInt(count);
  5. s.writeObject(value);
  6. }

    在进行序列化的时候保存StringBuilder对象的状态到一个流中。

(6)  readObject()方法源码如下:

  1. private void readObject(java.io.ObjectInputStream s)
  2. throws java.io.IOException, ClassNotFoundException {
  3. s.defaultReadObject();
  4. count = s.readInt();
  5. value = (char[]) s.readObject();
  6. }

    反序列化时从流中获取StringBuild对象序列化之前的状态。

三、总结

    StringBuilder类与StringBuffer类大致相同,记住最大的不同就是StringBuffer类成员方法采用了同步关键字synchronized修饰,所以是线程安全的,但是也导致效率要低一些。那么关于String家族的类就介绍到这里,接下来进入线程相关的类学习中,敬请期待《我的jdk源码(六): Thread 》。

     更多精彩内容,请扫描关注我的微信公众号【Java觉浅】,获取第一时间更新!

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/1020265
推荐阅读
相关标签
  

闽ICP备14008679号