我看JAVA 之 AbstractStringBuilder & StringBuffer & StringBuilder

简介:

我看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. 返回当前字符串实际长度,count
public 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() 实时创建字符串拷贝返回
相关文章
|
2月前
|
安全 Java
Java StringBuffer 和 StringBuilder 类
Java StringBuffer 和 StringBuilder 类
16 0
|
4天前
|
安全
String、StringBuuffer、StringBuilder三者的区别
String、StringBuuffer、StringBuilder三者的区别
|
9天前
|
缓存 安全 Java
【Java基础】String、StringBuffer和StringBuilder三种字符串对比
【Java基础】String、StringBuffer和StringBuilder三种字符串对比
6 0
|
10天前
|
Java API 索引
Java基础&API(2) String、StringBuilder详解
Java基础&API(2) String、StringBuilder详解
|
10天前
|
存储 编解码 算法
Java 的 String StringBuilder StringBuffer(上)
Java 的 String StringBuilder StringBuffer
27 0
|
11天前
|
存储 安全 Java
面试官:请聊一聊String、StringBuilder、StringBuffer三者的区别
面试官:请聊一聊String、StringBuilder、StringBuffer三者的区别
36 8
|
25天前
|
移动开发 安全 Java
String、StringBuffer 、StringBuilder、StringJoiner
String、StringBuffer 、StringBuilder、StringJoiner
|
2月前
|
存储 缓存 安全
JAVA面试:String、StringBuffer和StringBuilder区别
`String`是不可变的,`StringBuffer`和`StringBuilder`是可变的。`String`的不可变性源于其内部的`final char[]`数组,这意味着每次修改都会创建新对象。`StringBuffer`线程安全,方法同步,适合多线程环境,但效率较低;`StringBuilder`非线程安全,无同步,单线程中效率更高。两者初始容量相同,扩容机制也一样。
29 0
|
2月前
|
安全 Java
Java StringBuilder 类
Java StringBuilder 类
10 1
|
2月前
|
安全 Java 索引
Java StringBuffer 类
Java StringBuffer 类
7 0