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

JDK源码之——AbstractStringBuilder

部分方法没有解释,有疑问或错误的地方,欢迎评论指出importsun.misc.FloatingDecimal;importjava.util.Arr

部分方法没有解释,有疑问或错误的地方,欢迎评论指出

import sun.misc.FloatingDecimal;import java.util.Arrays;ort javtil.Arrays;/*** StringBuilder 抽象类*/
abstract class AbstractStringBuilder implements Appendable, CharSequence {/*** 储存值的数组*/char[] value;/*** 容量大小*/int count;/*** 无参构造*/AbstractStringBuilder() {}/*** 根据传入长度构造 AbstractStringBuilder*/AbstractStringBuilder(int capacity) {value = new char[capacity];}/*** 返回字符串长度 (字符数)*/@Overridepublic int length() {return count;}/*** 返回当前容量*/public int capacity() {return value.length;}/*** 确保容量足够*/public void ensureCapacity(int minimumCapacity) {if (minimumCapacity > 0)ensureCapacityInternal(minimumCapacity);}// 判断传入容量是否超过容量 超过则扩容private void ensureCapacityInternal(int minimumCapacity) {if (minimumCapacity - value.length > 0)expandCapacity(minimumCapacity);}/*** 扩容*/void expandCapacity(int minimumCapacity) {//一次长度为length + 2int newCapacity = value.length * 2 + 2;//如果扩容一次还不足minimumCapacity,则取minimumCapacityif (newCapacity - minimumCapacity <0)newCapacity = minimumCapacity;//如果newCapacity还小于0 , 则取Integer所支持的最大值if (newCapacity <0) {if (minimumCapacity <0) // overflowthrow new OutOfMemoryError();newCapacity = Integer.MAX_VALUE;}//复制数组的值 到新的数组中,新的数组长度为newCapacityvalue = Arrays.copyOf(value, newCapacity);}/*** 尝试减少value所占用的存储空间。* 如果缓冲区 length 大于保持其当前序列所需的缓冲区字符 count ,* 则调整value的大小以提高空间效率*/public void trimToSize() {if (count = count))throw new StringIndexOutOfBoundsException(index);return value[index];}//复制数组public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin){if (srcBegin <0)throw new StringIndexOutOfBoundsException(srcBegin);if ((srcEnd <0) || (srcEnd > count))throw new StringIndexOutOfBoundsException(srcEnd);if (srcBegin > srcEnd)throw new StringIndexOutOfBoundsException("srcBegin > srcEnd");System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);}//在指定位置插入charpublic void setCharAt(int index, char ch) {if ((index <0) || (index >= count))throw new StringIndexOutOfBoundsException(index);value[index] = ch;}//appendpublic AbstractStringBuilder append(Object obj) {return append(String.valueOf(obj));}//append字符串,添加字符串public AbstractStringBuilder append(String str) {if (str == null)//添加空 则添加"null"return appendNull();int len = str.length();//确保容量ensureCapacityInternal(count + len);//复制数组str.getChars(0, len, value, count);//容量同步count += len;return this;}// Documentation in subclasses because of synchro differencepublic AbstractStringBuilder append(StringBuffer sb) {if (sb == null)return appendNull();int len = sb.length();ensureCapacityInternal(count + len);sb.getChars(0, len, value, count);count += len;return this;}/*** 从1.8新增* @since 1.8*/AbstractStringBuilder append(AbstractStringBuilder asb) {if (asb == null)return appendNull();int len = asb.length();ensureCapacityInternal(count + len);asb.getChars(0, len, value, count);count += len;return this;}// Documentation in subclasses because of synchro difference@Overridepublic AbstractStringBuilder append(CharSequence s) {if (s == null)return appendNull();if (s instanceof String)return this.append((String)s);if (s instanceof AbstractStringBuilder)return this.append((AbstractStringBuilder)s);return this.append(s, 0, s.length());}//添加 "null" countprivate AbstractStringBuilder appendNull() {int c = count;ensureCapacityInternal(c + 4);final char[] value = this.value;value[c++] = &#39;n&#39;;value[c++] = &#39;u&#39;;value[c++] = &#39;l&#39;;value[c++] = &#39;l&#39;;count = c;return this;}//添加 固定长度字符@Overridepublic AbstractStringBuilder append(CharSequence s, int start, int end) {if (s == null)s = "null";if ((start <0) || (start > end) || (end > s.length()))throw new IndexOutOfBoundsException("start " + start + ", end " + end + ", s.length() "+ s.length());int len = end - start;ensureCapacityInternal(count + len);for (int i = start, j = count; i count)end = count;if (start > end)throw new StringIndexOutOfBoundsException();int len = end - start;if (len > 0) {System.arraycopy(value, start+len, value, start, count-end);count -= len;}return this;}/*** 删除指定位置的字符* @param index* @return*/public AbstractStringBuilder deleteCharAt(int index) {if ((index <0) || (index >= count))throw new StringIndexOutOfBoundsException(index);//数组拷贝System.arraycopy(value, index+1, value, index, count-index-1);count--;return this;}//字符替换public AbstractStringBuilder replace(int start, int end, String str) {if (start <0)throw new StringIndexOutOfBoundsException(start);if (start > count)throw new StringIndexOutOfBoundsException("start > length()");if (start > end)throw new StringIndexOutOfBoundsException("start > end");if (end > count)end = count;int len = str.length();int newCount = count + len - (end - start);//检查容量ensureCapacityInternal(newCount);//数组拷贝System.arraycopy(value, end, value, start + len, count - end);str.getChars(value, start);count = newCount;return this;}//字符串截取 开始位置到最后位置public String substring(int start) {return substring(start, count);}//字符串截取 start开始位置 end结束位置public String substring(int start, int end) {if (start <0)throw new StringIndexOutOfBoundsException(start);if (end > count)throw new StringIndexOutOfBoundsException(end);if (start > end)throw new StringIndexOutOfBoundsException(end - start);return new String(value, start, end - start);}@Overridepublic abstract String toString();//返回char[]final char[] getValue() {return value;}}

 


推荐阅读
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • AIX编程挑战赛:AIX正方形问题的算法解析与Java代码实现
    在昨晚的阅读中,我注意到了CSDN博主西部阿呆-小草屋发表的一篇文章《AIX程序设计大赛——AIX正方形问题》。该文详细阐述了AIX正方形问题的背景,并提供了一种基于Java语言的解决方案。本文将深入解析这一算法的核心思想,并展示具体的Java代码实现,旨在为参赛者和编程爱好者提供有价值的参考。 ... [详细]
  • JavaScript XML操作实用工具类:XmlUtilsJS技巧与应用 ... [详细]
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 开发日志:201521044091 《Java编程基础》第11周学习心得与总结
    开发日志:201521044091 《Java编程基础》第11周学习心得与总结 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • Java能否直接通过HTTP将字节流绕过HEAP写入SD卡? ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • Objective-C 中的委托模式详解与应用 ... [详细]
  • 提升Android开发效率:Clean Code的最佳实践与应用
    在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
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社区 版权所有