JDK源码解析之 Java.lang.StringBuffer

StringBuffer类表示一个可变的字符序列。StringBuffer的API与StringBuilder互相兼容,但是StringBuffer是线程安全的。在可能的情况下,建议优先使用StringBuilder,因为在大多数实现中它比StringBuffer更快。

一、类定义

public final class StringBufferextends AbstractStringBuilderimplements java.io.Serializable, CharSequence
{...
}

StringBuffer类被 final 所修饰,因此不能被继承。

StringBuffer类继承于 AbstractStringBuilder类。实际上,AbstractStringBuilder类具体实现了可变字符序列的一系列操作,比如:append()、insert()、delete()、replace()、charAt()方法等。值得一提的是,StringBuilder也是继承于AbstractStringBuilder类。

StringBuffer类实现了2个接口:

  • Serializable 序列化接口,表示对象可以被序列化。
  • CharSequence 字符序列接口,提供了几个对字符序列进行只读访问的方法,比如:length()、charAt()、subSequence()、toString()方法等。

二、成员变量

private transient char[] toStringCache;// AbstractStringBuilder.javachar[] value;int count;
  • value、count这两个变量是继承自父类

  • toStringCache 用来缓存toString()方法返回的最近一次的value数组中的字符。当修改StringBuffer对象时会被清除。

三、构造方法

//默认构造方法设置了value数组的初始容量为16。
public StringBuffer() {super(16);
}
//设置了value数组的初始容量为指定的大小。
public StringBuffer(int capacity) {super(capacity);
}
//接受一个String对象作为参数,设置了value数组的初始容量为String对象的长度+16,并把String对象中的字符添加到value数组中。
public StringBuffer(String str) {super(str.length() + 16);append(str);
}
//接受一个CharSequence对象作为参数,设置了value数组的初始容量为CharSequence对象的长度+16,并把CharSequence对象中的字符添加到value数组中。
public StringBuffer(CharSequence seq) {this(seq.length() + 16);append(seq);
}// AbstractStringBuilder.java
AbstractStringBuilder(int capacity) {value = new char[capacity];
}

StringBuffer类提供了4个构造方法。构造方法主要完成了对value数组的初始化。

四、普通方法

StringBuilder实现了AbstractStringBuilder和CharSequence,他的方法都来自于这两个类,绝大部分都是通过super来调用的。

4.1、append()方法
@Override
public synchronized StringBuffer append(boolean b) {toStringCache = null;super.append(b);return this;
}// AbstractStringBuilder.java
public AbstractStringBuilder append(boolean b) {if (b) {ensureCapacityInternal(count + 4);value[count++] = 't';value[count++] = 'r';value[count++] = 'u';value[count++] = 'e';} else {ensureCapacityInternal(count + 5);value[count++] = 'f';value[count++] = 'a';value[count++] = 'l';value[count++] = 's';value[count++] = 'e';}return this;
}    @Override
public synchronized StringBuffer append(String str) {toStringCache = null;super.append(str);return this;
}// AbstractStringBuilder.java
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;
}    

调用了父类AbstractStringBuilder类中对应的方法。最后,append()方法返回了StringBuffer对象自身。

append()方法将指定参数类型的字符串表示形式追加到字符序列的末尾。它可以接受boolean、char、char[]、CharSequence、double、float、int、long、Object、String、StringBuffer这些类型的参数。这些方法最终都,以便用户可以链式调用StringBuilder类中的方法。

AbstractStringBuilder类的各个append()方法大同小异。append()方法在追加字符到value数组中之前都会调用ensureCapacityInternal()方法来确保value数组有足够的容量,然后才把字符追加到value数组中。

4.2、toString()方法
@Override
public String toString() {// Create a copy, don't share the arrayreturn new String(value, 0, count);
}
4.3、writeObject和readObject
    /*** Save the state of the {@code StringBuilder} instance to a stream* (that is, serialize it).** @serialData the number of characters currently stored in the string*             builder ({@code int}), followed by the characters in the*             string builder ({@code char[]}).   The length of the*             {@code char} array may be greater than the number of*             characters currently stored in the string builder, in which*             case extra characters are ignored.*/private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException {s.defaultWriteObject();s.writeInt(count);s.writeObject(value);}/*** readObject is called to restore the state of the StringBuffer from* a stream.*/private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException {s.defaultReadObject();count = s.readInt();value = (char[]) s.readObject();}

实现自Serializable接口后,可定制的序列化过程

4.4、toStringCache()

StringBuffer中有一个toStringCache 就像它的名字一样,toString()方法的cache

简言之就是缓存toString方法的,每次调用toString会检查这个字段,如果不为null将会使用它进行对象创建

如果为null 将会给他初始化赋值,也就是缓存,当调用其他的任何方法改变StringBuffer时,就会把toStringCache进行清空

五、总结

StringBuffer类将所有操作字符序列的方法都添加了 synchronized 关键字来修饰,因此,StringBuffer类是线程安全的。

  • 他是可变的字符序列的抽象模型,定义了可变字符序列的公共行为

  • 它是一个抽象类,针对一些操作提供了默认的实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redo和undo

这是在网上看到的对redo和undo的探讨: 1. redo 记录所有做过的事情,用于恢复 undo 记录事务的前镜相,用于回滚2. redo,恢复数据库时,按照重做日志文件来恢复你之前的操作 undo,撤消你做过的操作&#xff0…

JDK源码解析之 Java.lang.StringBuilder

StringBuilder类表示一个可变的字符序列。StringBuilder的API与StringBuffer互相兼容,但是StringBuilder是非线程安全的,在大多数实现中它比StringBuffer更快。 一、类定义 public final class StringBufferextends AbstractStringBuilderimplements ja…

从映射观点看索引

信息检索主要有“检”与“索(办手续)”两个动作。在图书馆借书时,一般而言, 找书的时间比办理手续的时间长得多,因而缩短检查时间是提高效率的关键。数据库中检 索信息也与此类似。 在没有索引文件时,DBM…

JDK源码解析之 Java.lang.Boolean

Boolean 类是将 boolean 基本类型进行包装。类型为 Boolean 的对象包含一个单一属性 value,其类型为 boolean。 此外还提供了许多将 boolean 转换为 String、String 转换为 boolean,以及其他一些方法。 一、类定义 public final class Boolean implemen…

MYSQL的集群的安装与配置(mysql-5.1.21)

具体安装与配置:1)准备工作:6台机器,IP地址分别为192.168.0.(231-236)MGM节点:192.168.0.231(232)SQL 节点:192.168.0.233-234NDBD 节点:192.168.0.235-236系统都是REDHA…

JDK源码解析之 Java.lang.Byte

byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数,以二进制补码表示的整数 取值范围:默认值为0,最小值为-128(-27);最大值是127(27-1) Byt…

在命令行模式下管理SELinux

作者: Oslad.com (原创!转载请注明出处) 2006-07-14 在 GUI 图形界面模式下,要更改 SELinux 的策略使用方式,只需依次点击“应用程序”,“系统设置”,“安全级别”;然后在“安全级别配置”对…

JDK源码解析之 Java.lang.Double

Double类是原始类型double的包装类,它包含若干有效处理double值的方法,如将其转换为字符串表示形式,反之亦然。Double类的对象可以包含一个double值。 Double类包装原始类型的值 double中的对象。类型的对象 Double包含一个类型为的字段 doub…

网页搜索帮助-禁止搜索引擎收录的方法

什么是robots.txt文件?搜索引擎使用spider程序自动访问互联网上的网页并获取网页信息。spider在访问一个网站时,会首先会检查该网站的根域下是否有一个叫做robots.txt的纯文本文件。您可以在您的网站中创建一个纯文本文件robots.txt,在文件中声明该网站…

JDK源码解析之 Java.lang.Float

Float类是原始类型float的包装类&#xff0c;它包含若干有效处理浮点值的方法&#xff0c;如将其转换为字符串表示形式&#xff0c;反之亦然。Float类的一个对象可以包含一个浮点值 一、类定义 public final class Float extends Number implements Comparable<Float> {…

FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP)

在主动模式下&#xff0c;FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接&#xff0c;然后开放N1号端口进行监听&#xff0c;并向服务器发出PORT N 1命令。服务器接收到命令后&#xff0c;会用其本地的FTP数据端口&#xff08;通常是20&#xff09;来连接客户…

JDK源码解析之 java.lang.Integer

teger 基本数据类型int 的包装类 Integer 类型的对象包含一个 int 类型的字段 一、类定义 public final class Integer extends Number implements Comparable<Integer>{}类被声明为final的,表示不能被继承;继承了Number抽象类,可以用于数字类型的一系列转换;实现了Comp…

Loadrunner的基本概念

1)vuser_init(only one &#xff0c;重复执行脚本的时候&#xff0c;此部分只会执行一次 ) %G< rJc*P 2)action( 一个或者多个 , 重复执行脚本的时候&#xff0c;只有该部分会按重复的次数重复执行 ) z*Xfjy(Mj 3)vuser_end(only one, 重复执行脚本的时候&#xff0c;此…

JDK源码解析之 java.lang.Long

Long 与Integer 是数值类型中使用频率最高的两个,也是提供支持方法最多的两个 他们提供出来的方法功能也是高度的相似 一、类定义 public final class Long extends Number implements Comparable<Long> {}类被声明为final的,表示不能被继承;继承了Number抽象类,可以用于…

sed教程入门与实例练习(一)

UNIX 世界中有很多文本编辑器可供我们选择。思考一下 — vi、emacs 和 jed 以及很多其它工具都会浮现在脑海中。我们都有自己已逐渐了解并且喜爱的编辑器&#xff08;以及我们喜爱的组合键&#xff09;。有了可信赖的编辑器&#xff0c;我们可以轻松处理任何数量与 UNIX 有关的…

JDK源码解析之 Java.lang.Short

Short类是基本类型short 的包装类&#xff0c;它包含几种有效处理短值的方法&#xff0c;如将其转换为字符串表示形式&#xff0c;反之亦然。Short类的对象可以包含单个短值。 一、类定义 public final class Short extends Number implements Comparable<Short> {}类被…

sed教程入门与实例练习(二)

让我们看一下 sed 最有用的命令之一&#xff0c;替换命令。使用该命令&#xff0c;可以将特定字符串或匹配的规则表达式用另一个字符串替换。下面是该命令最基本用法的示例&#xff1a; $ sed -e ’s/foo/bar/’ myfile.txt上面的命令将 myfile.txt 中每行第一次出现的 ‘foo’…

Oracle GoldenGate简介

一、什么是Oracle GoldenGate&#xff1f; Oracle GoldenGate是用于实时数据集成和复制的综合软件包。它支持高可用性解决方案&#xff0c;实时数据集成&#xff0c;事务性更改数据捕获&#xff0c;数据复制&#xff0c;转换以及运营和分析企业系统之间的验证。 使用Oracle G…

sed教程入门与实例练习(三)

在第二篇 sed 文章中&#xff0c;我提供了一些示例来演示 sed 的工作原理&#xff0c;但是它们当中很少有示例能实际做特别有用的事。在这篇 sed 系列的最后文章中&#xff0c;我要改变那种方式&#xff0c;并使用 sed 来做实际的事。我将为您显示几个示例&#xff0c;它们不仅…

Oracle GoldenGate微服务架构

Oracle GoldenGate支持两种架构&#xff0c;经典架构和微服务架构&#xff08;MA&#xff09;。 可以出于以下目的配置Oracle GoldenGate&#xff1a; 从一个数据库中静态提取数据记录&#xff0c;并将这些记录加载到另一个数据库中。连续提取和复制事务性数据处理语言&#…