sth before start
接下来会看StringBuffer、StringBuilder、StringJoiner。其实我感觉这几个类的实现原理应该是不难的,字符串拼接无非就是字符数组的操作,然后调用String的构造函数返回嘛。不过我印象里这些类的效率还是有差别的,有点好奇具体有什么差别。
StringBuffer说明
- 线程安全,方法都是同步的(synchronized)
- 可变的字符数组段(sequence of characters)
- 他的操作虽然是线程安全的,但是如果传入的原数据(source sequence)是多个线程共享的,那么为了保证线程安全,执行方法的时候也需要获得锁来保证线程安全
- 自动扩容
- 除法特殊说明,传入空指针会抛出空指针异常
- StringBuilder更快,因为他不需要同步
- 实现了Comparable,但是没有重写equals,要是用StringBuffer作为SortedMap的key时要注意
属性
private transient String toStringCache;
//缓存toString的返回值
//transient表示序列化的时候不会被序列化
//调用insert或其他会改变字符串的方法的时候会设置成空
方法
然后其实方法里都是调用了父类AbstractStringBuilder
的方法,append之类的方法其实都是在这个类里实现的。StringBuffer和StringBuilder只是一个包装类。
构造函数
- public StringBuffer() {super(16);}
创建容量为16的StringBuffer - public StringBuffer(int capacity)
- public StringBuffer(String str)
根据str的属性创建新的byte[],然后调用append进行初始化
append(str)
- 查看编码,看看需不需要从Latin1改成UTF16
- 看看容量够不够,不够就扩容
- 调用String的getBytes,将str的内容拷贝进现在的value里
其他方法也都是大同小异的字符串操作
比较函数
- 0 :相同
- 正数:调用方字典序前
- 负数:调用方字典序后
关于同步
其实就是在所有的方法头都用上了synchronized。。。。。。
我绷不住了