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

 


推荐阅读
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
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社区 版权所有