热门标签 | 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



推荐阅读
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 实现系统调用
    实现系统调用一、实验环境​本次操作还是基于上次编译Linux0.11内核的实验环境进行操作。环境如下:二、实验目标​通过对上述实验原理的认识,相信 ... [详细]
  • 在Effective Java第三版中,建议在方法返回类型中优先考虑使用Collection而非Stream,以提高代码的灵活性和兼容性。 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • 探讨了在HTML表单中使用元素代替进行表单提交的方法。 ... [详细]
  • 深入解析 C++ 中的 String 和 Vector
    本文详细介绍了 C++ 编程语言中 String 和 Vector 的使用方法及特性,旨在帮助开发者更好地理解和应用这两个重要的容器。 ... [详细]
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • 在Android中实现黑客帝国风格的数字雨效果
    本文将详细介绍如何在Android平台上利用自定义View实现类似《黑客帝国》中的数字雨效果。通过实例代码,我们将探讨如何设置文字颜色、大小,以及如何控制数字下落的速度和间隔。 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 管理UINavigationController中的手势返回 - Managing Swipe Back Gestures in UINavigationController
    本文介绍了如何在一个简单的闪存卡片应用中实现平滑的手势返回功能,以增强用户体验。 ... [详细]
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社区 版权所有