Java源码分析之AbstractStringBuilder

本文主要探讨了AbstractStringBuilder的内部实现,包括其成员变量、构造函数和一系列关键方法,如length()、capacity()管理、charAt与getChars操作、append、delete、replace、substring、insert和reverse等,为理解StringBuilder提供了基础。
摘要由CSDN通过智能技术生成

在看StringBuilder之前,还是来先看下AbstractStringBuilder吧

成员变量

//这也是较String很大的一个不同点,是可变的
char[] value;

//表示目前已经用了多长,注意,count!=value.length
int count;

构造函数

AbstractStringBuilder() {
}

//给定一个初始的空间
AbstractStringBuilder(int capacity) {
    value = new char[capacity];
}

基本方法

length() 与 capacity()

//一个是返回目前已经用了的长度,一个是返回目前有多少空间
public int length() {
    return count;
}

public int capacity() {
    return value.length;
}

空间处理(个人感觉,是AbstractStringBuilder的精髓

//确保有minimumCapacity这么多的空间
public void ensureCapacity(int minimumCapacity) {
    if (minimumCapacity > 0)
        ensureCapacityInternal(minimumCapacity);
}

/**
 * This implements the expansion semantics of ensureCapacity with no
 * size check or synchronization.
 */
private void ensureCapacityInternal(int minimumCapacity) {
    // overflow-conscious code
    if (minimumCapacity - value.length > 0)
        expandCapacity(minimumCapacity);
}

//取当前空间的2倍与需要空间的最大值
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);
}
//去掉没用的空间,可以和上面的连着一起用,就是有点儿费时间
public void trimToSize() {
    if (count < value.length) {
        value = Arrays.copyOf(value, count);
    }
}

charAt 与 getChars

public char charAt(int index) {
    if ((index < 0) || (index >= count))
        throw new StringIndexOutOfBoundsException(index);
    return value[index];
}

public void setCharAt(int index, char ch) {
    if ((index < 0) || (index >= count))
        throw new StringIndexOutOfBoundsException(index);
    value[index] = ch;
}
//把value的srcBegin至srcEnd复制到dst的dstBegin后
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin){
    if (srcBegin < 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值