热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java源码阅读StringBuilder

1类签名与注释publicfinalclassStringBuilderextendsAbstractStringBuilderimplementsjava.io.Serializ

1类签名与注释

public final class StringBuilderextends AbstractStringBuilderimplements java.io.Serializable, CharSequence

一个可变的字符序列。 此类提供与StringBuffer相同的API,但不保证同步。在单线程中应该优先使用StringBuilder,因为它不需要同步,在大多数实现中将更快。

StringBuilder的主要实现是append与insert方法,他们是重载的,以便接受任何类型的数据。append方法始终在末尾添加字符,而insert方法在指定位置添加。

每个StringBuilder都有一个容量,只要StringBuilder中包含的字符序列的长度不超过容量,则不需要分配新的内部缓冲区。 如果内部缓冲区溢出,则会自动变大。

 

2基本属性

StringBuilder是通过char数组实现的,字符数组声明在其父类AbstractStringBuilder中,详情如下

 

//存储字符的数组
char[] value;//当前数组中已有字符的计数
int count;

 

注意区别count和value.length,前者是已有字符的计数,后者是StringBuilder的容量。

 

StringBuilder的默认初始化容量是16。

 

3 常用方法

(1)append方法

append方法实在StringBuilder末尾添加字符

StringBuilder的append方法是重载的,以便接受任何类型的数据。下面是append String的方法

 

//append String
public StringBuilder append(String str) {super.append(str);return this;}
// 父类AbstractStringBuilder中具体实现
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;}

 

append String时,首先会检查是否需要扩容(ensureCapacityInternal),然后调用String的getChars方法,将str的字符数组追加到value的后面,最后将当前的字符计数count加上str的长度。ensureCapacityInternal方法如下(AbstractStringBuilder中实现)

private void ensureCapacityInternal(int minimumCapacity) {// overflow-conscious codeif (minimumCapacity - value.length > 0) {value &#61; Arrays.copyOf(value,newCapacity(minimumCapacity)); }}private int newCapacity(int minCapacity) {// overflow-conscious codeint newCapacity &#61; (value.length <<1) &#43; 2;if (newCapacity - minCapacity <0) {newCapacity &#61; minCapacity;}return (newCapacity <&#61; 0 || MAX_ARRAY_SIZE - newCapacity <0)? hugeCapacity(minCapacity): newCapacity;}private int hugeCapacity(int minCapacity) {if (Integer.MAX_VALUE - minCapacity <0) { // overflowthrow new OutOfMemoryError();}return (minCapacity > MAX_ARRAY_SIZE)? minCapacity : MAX_ARRAY_SIZE;}

ensureCapacityInternal首先检查是否需要扩容&#xff0c;只有当count&#43;str.length&#xff08;&#xff09;的长度大于自身容量的情况下才需要扩容。

若扩容&#xff0c;则newCapacity方法决定扩容多少&#xff0c;最小扩容的新容量&#61;旧容量*2&#43;2&#xff0c;当这个值还小于count&#43;str.length&#xff08;&#xff09;时&#xff0c;新容量&#61;count&#43;str.length&#xff08;&#xff09;

其他重载的append方法原理差不多&#xff0c;这里就不多说了。

 

&#xff08;2&#xff09;insert方法

insert方法可以在StringBuilder指定位置添加字符&#xff08;串&#xff09;

StringBuilder的insert方法是重载的&#xff0c;以便接受任何类型的数据。下面是在指定开始位置insert String的实现

 

//指定开始位置insert String
public StringBuilder insert(int offset, String str) {super.insert(offset, str);return this;}//父类AbstractStringBuilder中具体实现
public AbstractStringBuilder insert(int offset, String str) {if ((offset <0) || (offset > length()))throw new StringIndexOutOfBoundsException(offset);if (str &#61;&#61; null)str &#61; "null";int len &#61; str.length();ensureCapacityInternal(count &#43; len);System.arraycopy(value, offset, value, offset &#43; len, count - offset);str.getChars(value, offset);count &#43;&#61; len;return this;}

 

底层还是调用System.arraycopy通过数组复制实现的。

 

&#xff08;3&#xff09;delete

 

&#xff08;4&#xff09;replace

 

 

 

转:https://www.cnblogs.com/ouym/p/9016945.html



推荐阅读
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文详细介绍了Java中的访问器(getter)和修改器(setter),探讨了它们在保护数据完整性、增强代码可维护性方面的重要作用。通过具体示例,展示了如何正确使用这些方法来控制类属性的访问和更新。 ... [详细]
  • 本文介绍如何使用JPA Criteria API创建带有多个可选参数的动态查询方法。当某些参数为空时,这些参数不会影响最终查询结果。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 本文详细介绍了Java中的输入输出(IO)流,包括其基本概念、分类及应用。IO流是用于在程序和外部资源之间传输数据的一套API。根据数据流动的方向,可以分为输入流(从外部流向程序)和输出流(从程序流向外部)。此外,还涵盖了字节流和字符流的区别及其具体实现。 ... [详细]
  • 开发笔记:9.八大排序
    开发笔记:9.八大排序 ... [详细]
author-avatar
嘻嘻嘻嘻
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有