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

StringBuffer源码分析

StringBuffer里面的方法几乎都是AbstractStringBuilder里面的方法、具体的实现也都是在AbstractStringBuilder里面,需要

StringBuffer里面的方法几乎都是AbstractStringBuilder里面的方法、具体的实现也都是在AbstractStringBuilder里面,需要结合AbstractStringBuilder源码一起查看。

AbstractStringBuilder源码分析:https://blog.csdn.net/qq_26896085/article/details/95593388

package java.lang;import java.util.Arrays;
public final class StringBufferextends AbstractStringBuilderimplements java.io.Serializable, CharSequence
{// transient 让某些被修饰的成员属性变量不被序列化// 在toString方法中使用到&#xff0c;private transient char[] toStringCache;static final long serialVersionUID &#61; 3388685877147921107L;// 初始化长度默认为16public StringBuffer() {super(16);}// 传入参数初始化默认为capacitypublic StringBuffer(int capacity) {super(capacity);}// 构造函数, 传入一个字符串public StringBuffer(String str) {// 初始化的长度为传入长度&#43;16super(str.length() &#43; 16);append(str);}// 构造函数, 传入一个字符序列public StringBuffer(CharSequence seq) {// 初始化的长度为传入长度&#43;16this(seq.length() &#43; 16);append(seq);}// 获取当前StringBuffer的长度&#64;Overridepublic synchronized int length() {return count;}// 获取当前StringBuffer的容量&#64;Overridepublic synchronized int capacity() {return value.length;}// 是否进行扩容&#64;Overridepublic synchronized void ensureCapacity(int minimumCapacity) {super.ensureCapacity(minimumCapacity);}// 减少字符序列的存储&#64;Overridepublic synchronized void trimToSize() {super.trimToSize();}// 设置容量&#64;Overridepublic synchronized void setLength(int newLength) {toStringCache &#61; null;super.setLength(newLength);}// 获取当前字符串中的某个字符&#64;Overridepublic synchronized char charAt(int index) {if ((index <0) || (index >&#61; count))throw new StringIndexOutOfBoundsException(index);return value[index];}// 返回指定索引处的字符的编码&#64;Overridepublic synchronized int codePointAt(int index) {return super.codePointAt(index);}// 获取到value[index]前面一位的字符编码&#xff0c;即value[--index]的字符编码&#64;Overridepublic synchronized int codePointBefore(int index) {return super.codePointBefore(index);}// 计算beginIndex与endIndex索引之间字符的数量&#xff0c;[beginIndex, endIndex),&#64;Overridepublic synchronized int codePointCount(int beginIndex, int endIndex) {return super.codePointCount(beginIndex, endIndex);}// 返回偏移位置的字符&#xff0c;返回value[(index&#43;codePointOffset)]&#64;Overridepublic synchronized int offsetByCodePoints(int index, int codePointOffset) {return super.offsetByCodePoints(index, codePointOffset);}/*** 将字符串中的数据复制到dst中* &#64;param srcBegin 字符串中开始的下标* &#64;param srcEnd 字符串中结束的下标* &#64;param dst 将字符串中的字符串复制到dst中* &#64;param dstBegin dst中接收字符开始的位置*/// System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);&#64;Overridepublic synchronized void getChars(int srcBegin, int srcEnd, char[] dst,int dstBegin){super.getChars(srcBegin, srcEnd, dst, dstBegin);}// 用ch替换value[index]&#64;Overridepublic synchronized void setCharAt(int index, char ch) {if ((index <0) || (index >&#61; count))throw new StringIndexOutOfBoundsException(index);toStringCache &#61; null;value[index] &#61; ch;}// 在当前字符串末尾追加字符串// 调用父类中的append方法// toStringCache &#61; null;暂时不明白这句的意义&#64;Overridepublic synchronized StringBuffer append(Object obj) {toStringCache &#61; null;super.append(String.valueOf(obj));return this;}&#64;Overridepublic synchronized StringBuffer append(String str) {toStringCache &#61; null;super.append(str);return this;}public synchronized StringBuffer append(StringBuffer sb) {toStringCache &#61; null;super.append(sb);return this;}&#64;Overridesynchronized StringBuffer append(AbstractStringBuilder asb) {toStringCache &#61; null;super.append(asb);return this;}&#64;Overridepublic synchronized StringBuffer append(CharSequence s) {toStringCache &#61; null;super.append(s);return this;}&#64;Overridepublic synchronized StringBuffer append(CharSequence s, int start, int end){toStringCache &#61; null;super.append(s, start, end);return this;}&#64;Overridepublic synchronized StringBuffer append(char[] str) {toStringCache &#61; null;super.append(str);return this;}&#64;Overridepublic synchronized StringBuffer append(char[] str, int offset, int len) {toStringCache &#61; null;super.append(str, offset, len);return this;}&#64;Overridepublic synchronized StringBuffer append(boolean b) {toStringCache &#61; null;super.append(b);return this;}&#64;Overridepublic synchronized StringBuffer append(char c) {toStringCache &#61; null;super.append(c);return this;}&#64;Overridepublic synchronized StringBuffer append(int i) {toStringCache &#61; null;super.append(i);return this;}&#64;Overridepublic synchronized StringBuffer append(long lng) {toStringCache &#61; null;super.append(lng);return this;}&#64;Overridepublic synchronized StringBuffer append(float f) {toStringCache &#61; null;super.append(f);return this;}&#64;Overridepublic synchronized StringBuffer append(double d) {toStringCache &#61; null;super.append(d);return this;}// 在当前字符串的末尾追加字符&#xff0c;codePoint为字符的编码&#64;Overridepublic synchronized StringBuffer appendCodePoint(int codePoint) {toStringCache &#61; null;super.appendCodePoint(codePoint);return this;}// 删除当前字符下标为[start, end)的字符&#64;Overridepublic synchronized StringBuffer delete(int start, int end) {toStringCache &#61; null;super.delete(start, end);return this;}// 删除当前字符串下标为index的字符&#64;Overridepublic synchronized StringBuffer deleteCharAt(int index) {toStringCache &#61; null;super.deleteCharAt(index);return this;}// 用str替换掉当前字符串下标为[start, end)的字符串&#64;Overridepublic synchronized StringBuffer replace(int start, int end, String str) {toStringCache &#61; null;super.replace(start, end, str);return this;}// 截取当前字符串&#xff0c;下标为start至最后&#64;Overridepublic synchronized String substring(int start) {return substring(start, count);}// 截取当前字符串&#xff0c;下标为start至最后&#64;Overridepublic synchronized CharSequence subSequence(int start, int end) {return super.substring(start, end);}// 截取当前字符串&#xff0c;下标为start至最后&#64;Overridepublic synchronized String substring(int start, int end) {return super.substring(start, end);}//插入操作&#64;Overridepublic synchronized StringBuffer insert(int index, char[] str, int offset,int len){toStringCache &#61; null;super.insert(index, str, offset, len);return this;}&#64;Overridepublic synchronized StringBuffer insert(int offset, Object obj) {toStringCache &#61; null;super.insert(offset, String.valueOf(obj));return this;}&#64;Overridepublic synchronized StringBuffer insert(int offset, String str) {toStringCache &#61; null;super.insert(offset, str);return this;}&#64;Overridepublic synchronized StringBuffer insert(int offset, char[] str) {toStringCache &#61; null;super.insert(offset, str);return this;}&#64;Overridepublic StringBuffer insert(int dstOffset, CharSequence s) {// 注意&#xff0c;通过调用其他StringBuffer方法实现同步super.insert(dstOffset, s);return this;}&#64;Overridepublic synchronized StringBuffer insert(int dstOffset, CharSequence s,int start, int end){toStringCache &#61; null;super.insert(dstOffset, s, start, end);return this;}&#64;Overridepublic StringBuffer insert(int offset, boolean b) {// 通过调用StringBuffer insert&#xff08;int&#xff0c;String&#xff09;实现同步super.insert(offset, b);return this;}&#64;Overridepublic synchronized StringBuffer insert(int offset, char c) {toStringCache &#61; null;super.insert(offset, c);return this;}&#64;Overridepublic StringBuffer insert(int offset, int i) {// 通过调用StringBuffer insert&#xff08;int&#xff0c;String&#xff09;实现同步super.insert(offset, i);return this;}&#64;Overridepublic StringBuffer insert(int offset, long l) {// 通过调用StringBuffer insert&#xff08;int&#xff0c;String&#xff09;实现同步super.insert(offset, l);return this;}&#64;Overridepublic StringBuffer insert(int offset, float f) {// 通过调用StringBuffer insert&#xff08;int&#xff0c;String&#xff09;实现同步super.insert(offset, f);return this;}&#64;Overridepublic StringBuffer insert(int offset, double d) {// 通过调用StringBuffer insert&#xff08;int&#xff0c;String&#xff09;实现同步super.insert(offset, d);return this;}// 获取str在当前字符串中第一次出现的位置&#64;Overridepublic int indexOf(String str) {// 注意&#xff0c;通过调用其他StringBuffer方法实现同步return super.indexOf(str);}// 获取str在当前字符串fromIndex下标以后第一次出现的位置&#64;Overridepublic synchronized int indexOf(String str, int fromIndex) {return super.indexOf(str, fromIndex);}// 获取str在当前字符串中最后一次出现的位置&#64;Overridepublic int lastIndexOf(String str) {// 注意&#xff0c;通过调用其他StringBuffer方法实现同步return lastIndexOf(str, count);}// 获取str在当前字符串fromIndex下标之前最后一次出现的位置&#64;Overridepublic synchronized int lastIndexOf(String str, int fromIndex) {return super.lastIndexOf(str, fromIndex);}// 将当前字符串反转&#64;Overridepublic synchronized StringBuffer reverse() {toStringCache &#61; null;super.reverse();return this;}// 将当前的StringBuffer转换成String// 先将StringBuffer中的数据存放在toStringCache中&#xff0c;在new一个String对象&#64;Overridepublic synchronized String toString() {if (toStringCache &#61;&#61; null) {toStringCache &#61; Arrays.copyOfRange(value, 0, count);}return new String(toStringCache, true);}private static final java.io.ObjectStreamField[] serialPersistentFields &#61;{new java.io.ObjectStreamField("value", char[].class),new java.io.ObjectStreamField("count", Integer.TYPE),new java.io.ObjectStreamField("shared", Boolean.TYPE),};private synchronized void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException {java.io.ObjectOutputStream.PutField fields &#61; s.putFields();fields.put("value", value);fields.put("count", count);fields.put("shared", false);s.writeFields();}private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException {java.io.ObjectInputStream.GetField fields &#61; s.readFields();value &#61; (char[])fields.get("value", null);count &#61; fields.get("count", 0);}
}

 


推荐阅读
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • andr ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 在macOS环境下使用Electron Builder进行应用打包时遇到签名验证失败的问题,具体表现为签名后spctl命令检测到应用程序未通过公证(Notarization)。本文将详细探讨该问题的原因及解决方案。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
author-avatar
King347
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有