StringBuffer的解读(一)

简介: 对于StringBuffer的解读所有的源代码都是jdk1.8.0_202。append(String str)方法的实现,代码如下:@Overridepublic synchronized StringBuffer append(String str) { toStringCache = null; super.append(str);//直接调用父类的append方法。

对于StringBuffer的解读

所有的源代码都是jdk1.8.0_202。

  • append(String str)方法的实现,代码如下:
@Override
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);//直接调用父类的append方法。
    return this;
}

其中调用了其父类AbstractStringBuilderde的append(String str)这个方法,代码如下:

public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}

其中appendNull方法,代码如下:

private AbstractStringBuilder appendNull() {
    int c = count;
    ensureCapacityInternal(c + 4);
    final char[] value = this.value;
    value[c++] = 'n';
    value[c++] = 'u';
    value[c++] = 'l';
    value[c++] = 'l';
    count = c;
    return this;
}

其中ensureCapacityInternal方法,代码如下:

private void ensureCapacityInternal(int minimumCapacity) {
    // overflow-conscious code
    if (minimumCapacity - value.length > 0) {
        value = Arrays.copyOf(value,
                newCapacity(minimumCapacity));
    }
}

其中newCapacity方法,代码如下:

private int newCapacity(int minCapacity) {
    // overflow-conscious code
    int newCapacity = (value.length << 1) + 2;
    if (newCapacity - minCapacity < 0) {
        newCapacity = minCapacity;
    }
    return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
        ? hugeCapacity(minCapacity)
        : newCapacity;
}

我们再看看hugeCapacity是搞什么的,代码如下:

private int hugeCapacity(int minCapacity) {
    if (Integer.MAX_VALUE - minCapacity < 0) { // overflow
        throw new OutOfMemoryError();
    }
    return (minCapacity > MAX_ARRAY_SIZE)
        ? minCapacity : MAX_ARRAY_SIZE;
}

代码差不多了,总结一下:

  1. append方法大部分实现是在AbstractStringBuilder中
  2. 如果append的是null,直接将null这4个字符加在后面
  3. 如果不是null,原本剩余容量能接纳新的String,调用String.getChars()方法将新的字符串加进去,里面各种边界检查之后,调用的是System.arraycopy()方法,这是一个native的方法,依赖于底层的实现。
  4. 原本容量不够,好的,容量double之后+2,还不够吗?好的,就用你给的参数值(就是原本字符数量+需要加进去的字符数量)。再通过Arrays.copyOf()方法,先复制原先的字符,最后回append方法中,走第3步中String.getChars()方法。
目录
相关文章
|
算法 C# C++
HALCON error #1201: Wrong type of control parameter: 1 in operator threshold
HALCON error #1201: Wrong type of control parameter: 1 in operator threshold
|
11月前
|
安全 API 数据安全/隐私保护
速卖通AliExpress商品详情API接口深度解析与实战应用
速卖通(AliExpress)作为全球化电商的重要平台,提供了丰富的商品资源和便捷的购物体验。为了提升用户体验和优化商品管理,速卖通开放了API接口,其中商品详情API尤为关键。本文介绍如何获取API密钥、调用商品详情API接口,并处理API响应数据,帮助开发者和商家高效利用这些工具。通过合理规划API调用策略和确保合法合规使用,开发者可以更好地获取商品信息,优化管理和营销策略。
|
IDE 安全 Java
阿里开发手册 嵩山版-编程规约 (三)代码格式
《阿里开发手册 嵩山版》的编程规约部分详细介绍了代码格式规范,包括括号使用、空格、注释、行数限制等,旨在提高代码的可读性和维护性。
|
机器学习/深度学习 自然语言处理 算法
分词算法在自然语言处理中的应用与性能比较
分词算法在自然语言处理中的应用与性能比较
|
人工智能 Java 测试技术
开源上新|FunASR英文离线文件转写软件包发布
开源上新|FunASR英文离线文件转写软件包发布
|
缓存 关系型数据库 数据库
PG:checkpoint是什么
PG:checkpoint是什么
317 0
|
网络协议 关系型数据库 MySQL
宝塔node项目的部署
前段时间部署node项目的时候出现了一点问题,就是宝塔https一直开启不了,开启了显示time out,最后解决办法很简单,就换成443监听即可,不过不忍心一句话加一张插图完成一篇文章,所以给大家带来宝塔部署node项目的流程,并且开启https访问。
912 0
宝塔node项目的部署
阿里云最新产品手册——阿里云核心产品——倚天710——倚天710简介
阿里云最新产品手册——阿里云核心产品——倚天710——倚天710简介自制脑图
796 2
NR PUSCH(七) 相干传输
这篇就是为记录一个概念在协议中的体现方式。相干传输被定义为一种UE能力。考虑到UE的实现成本,NR不要求所有的UE都能做到所有的天线端口都可以相干传输。NR定义了以下3种UE的相干传输能力。
|
存储 弹性计算 安全
阿里云服务器ECS实例规格族ecs.xlarge详解
阿里云服务器ECS实例规格族ecs.xlarge详解阿里云服务器ECS分为多种实例规则,常见的有计算型c、通用型g和内存型r等,large代表vCPU核数,re内存增强、se代表存储增强、ne代表网络增强等,阿里云百科分享阿里云服务器ECS实例命名规则及举例说明:
975 0
阿里云服务器ECS实例规格族ecs.xlarge详解