JDK源码笔记05 StringBuffer、StringBuilder

sth before start

接下来会看StringBuffer、StringBuilder、StringJoiner。其实我感觉这几个类的实现原理应该是不难的,字符串拼接无非就是字符数组的操作,然后调用String的构造函数返回嘛。不过我印象里这些类的效率还是有差别的,有点好奇具体有什么差别。

StringBuffer说明

  1. 线程安全,方法都是同步的(synchronized)
  2. 可变的字符数组段(sequence of characters)
  3. 他的操作虽然是线程安全的,但是如果传入的原数据(source sequence)是多个线程共享的,那么为了保证线程安全,执行方法的时候也需要获得锁来保证线程安全
  4. 自动扩容
  5. 除法特殊说明,传入空指针会抛出空指针异常
  6. StringBuilder更快,因为他不需要同步
  7. 实现了Comparable,但是没有重写equals,要是用StringBuffer作为SortedMap的key时要注意

属性

private transient String toStringCache;
//缓存toString的返回值
//transient表示序列化的时候不会被序列化
//调用insert或其他会改变字符串的方法的时候会设置成空

方法

然后其实方法里都是调用了父类AbstractStringBuilder的方法,append之类的方法其实都是在这个类里实现的。StringBuffer和StringBuilder只是一个包装类。

构造函数

  1. public StringBuffer() {super(16);}
    创建容量为16的StringBuffer
  2. public StringBuffer(int capacity)
  3. public StringBuffer(String str)
    根据str的属性创建新的byte[],然后调用append进行初始化

append(str)

  1. 查看编码,看看需不需要从Latin1改成UTF16
  2. 看看容量够不够,不够就扩容
  3. 调用String的getBytes,将str的内容拷贝进现在的value里

其他方法也都是大同小异的字符串操作

比较函数

  • 0 :相同
  • 正数:调用方字典序前
  • 负数:调用方字典序后

关于同步

其实就是在所有的方法头都用上了synchronized。。。。。。
我绷不住了

posted @ 2021-07-02 22:13  sarise  阅读(60)  评论(0编辑  收藏  举报