写点什么

我看 JAVA 之 AbstractStringBuilder & StringBuffer & StringBuilder

用户头像
awen
关注
发布于: 2021 年 02 月 26 日

我看 JAVA 之 AbstractStringBuilder & StringBuffer & StringBuilder


注:基于 jdk11


AbstractStringBuilder


可变的抽象字符串创建类
复制代码


实现了如下几个接口:


1. Appendable    此接口的实现类可以拼接字符序列或单个字符。不保证线程安全,由实现类实现是否线程安全。使用java.util.Formatter格式化,必须为Appendable实现类2. CharSequence
复制代码


几个重要的成员变量:


/** * 字符串存储数据的字节数组,初始化的时候可以指定容量,默认为16 */byte[] value;
/** * 编码 0为Latin1 1为Utf-16 */byte coder;
/** * 当前字符串实际长度 */int count;
private static final byte[] EMPTYVALUE = new byte[0];
/** * byte [] 最大长度限制,超过VM限制长度会导致OOM */private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
复制代码


几个重要的方法:


1. 返回当前字符串实际长度,countpublic int length() {        return count;}2. 返回字符串容量public int capacity() {        return value.length >> coder;}3. 扩容,字节数组拷贝public void ensureCapacity(int minimumCapacity) {       if (minimumCapacity > 0) {                ensureCapacityInternal(minimumCapacity);      }}
private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code int oldCapacity = value.length >> coder; if (minimumCapacity - oldCapacity > 0) { value = Arrays.copyOf(value, newCapacity(minimumCapacity) << coder); }}private int newCapacity(int minCapacity) { // overflow-conscious code int oldCapacity = value.length >> coder; int newCapacity = (oldCapacity << 1) + 2; if (newCapacity - minCapacity < 0) { newCapacity = minCapacity; } int SAFE_BOUND = MAX_ARRAY_SIZE >> coder; return (newCapacity <= 0 || SAFE_BOUND - newCapacity < 0) ? hugeCapacity(minCapacity) : newCapacity;}
private int hugeCapacity(int minCapacity) { int SAFE_BOUND = MAX_ARRAY_SIZE >> coder; int UNSAFE_BOUND = Integer.MAX_VALUE >> coder; if (UNSAFE_BOUND - minCapacity < 0) { // overflow throw new OutOfMemoryError(); } return (minCapacity > SAFE_BOUND) ? minCapacity : SAFE_BOUND;}
复制代码


StringBuffer


线程安全的AbstractStringBuilder实现类
复制代码


几个重要的方法:


1. toString() 使用缓存机制,在第一次调用toString()的时候会将实时生成的字符串拷贝保存在toStringCache中,下次调用直接返回,如有变化,toStringCache置空
复制代码


StringBuilder


非线程安全的AbstractStringBuilder实现类
复制代码


几个重要的方法:


1. toString() 实时创建字符串拷贝返回
复制代码


用户头像

awen

关注

Things happen for a reason. 2019.11.15 加入

还未添加个人简介

评论

发布
暂无评论
我看JAVA 之 AbstractStringBuilder & StringBuffer & StringBuilder