String,StringBuilder,StringBuffer

String,StringBuilder,StringBuffer

它们的区别是什么?

String是通过被final修饰的char[]来存储字符串,不能被修改,StringBuffer是字符数组存储。String是字符串常量,每次的变更都会产生一个新的String对象复制给String引用。StringBuilder和StringBuffer都是可变的字符。StringBuffer是线程安全的。每个方法都synchronized进行同步。StringBuilder是线程安全的。

StringBuilder初始容量是多少?

StringBuilder默认构造函数的容量为16。

public StringBuilder() {
    super(16);
}

也可以通过传参来手动指定容量大小。

public StringBuilder(int capacity) {
    super(capacity);
}

如果构造函数传入一个字符串,则初始容量为原来基础长度+16

public StringBuilder(String str) {
    super(str.length() + 16);
    append(str);
}

StringBuilder扩容机制是什么?

当StringBuilder.append方法添加内容的时候,需要的最小长度minimumCapacity=count + len,其中count为原始内容长度,len为新添加的内容长度。当最小长度超过容量的长度。则开始进行扩容处理。扩容后的容量为value.length * 2 + 2;为原来的2倍+2。

private void ensureCapacityInternal(int minimumCapacity) {
    // overflow-conscious code
    if (minimumCapacity - value.length > 0)
        expandCapacity(minimumCapacity);
}
void expandCapacity(int minimumCapacity) {
    int newCapacity = value.length * 2 + 2;
    if (newCapacity - minimumCapacity < 0)
        newCapacity = minimumCapacity;
    if (newCapacity < 0) {
        if (minimumCapacity < 0) // overflow
            throw new OutOfMemoryError();
        newCapacity = Integer.MAX_VALUE;
    }
    value = Arrays.copyOf(value, newCapacity);
}

StringBuilder扩容后的数据是怎么变化的。

当现有数组扩容后,会创建一个容量为新的全新数组,之后通过System.arraycopy,将扩容前数组的内容拷贝到新的数组中返回。具体System.arraycopy数组的内部原理后面介绍。

public static char[] copyOf(char[] original, int newLength) {
    char[] copy = new char[newLength];
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}

转载于:https://my.oschina.net/hongliangsun/blog/1586566

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值