AbstractStringBuilder是一个抽象类,StringBuffer、StringBuilder则继承AbstractStringBuilder,所以先说AbstractStringBuilder。

AbstractStringBuilder

一、AbstractStringBuilder

//实现了两个接口,其中CharSequence这个字符序列的接口已经很熟悉了:
//1、该接口规定了需要实现该字符序列的长度:length();
//可以取得下标为index的的字符:charAt(int index);
//可以得到该字符序列的一个子字符序列: subSequence(int start, int end);
//规定了该字符序列的String版本(重写了父类Object的toString()):toString();
//2、Appendable接口顾名思义,定义添加的’规则’:
//append(CharSequence csq) throws IOException:如何添加一个字符序列
//append(CharSequence csq, int start, int end) throws IOException:如何添加一个字符序列的一部分
//append(char c) throws IOException:如何添加一个字符
abstract class AbstractStringBuilder implements Appendable, CharSequence

二、成员变量

//底层是一个char[],存储数据
char[] value;
//实际存储的数量
int count;

三、构造函数

AbstractStringBuilder() {
} AbstractStringBuilder(int capacity) {
value = new char[capacity];
}

四、主要方法

1、容量相关

//返回已经存储的实际长度
public int length() {
return count;
}
//得到目前该value数组的实际大小
public int capacity() {
return value.length;
}
//minimumCapacity所需的最小容量
public void ensureCapacity(int minimumCapacity) {
if (minimumCapacity > 0)
ensureCapacityInternal(minimumCapacity);
}
//当所需容量大于当前value的长度时,通过Arrays.copyOf创建新大小的数组
private void ensureCapacityInternal(int minimumCapacity) {
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
//如果value数组的容量有多余的,那么就把多余的全部都释放掉
public void trimToSize() {
if (count < value.length) {
value = Arrays.copyOf(value, count);
}
}

2、append

//AbstractStringBuilder提供了很多append()方法,选择重要的说
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;
}

另外还有delete()、replace()、insert()等方法。使用场景不多,加上源码不难,有需要的时候可以自行查看。

StringBuilder

一、类定义

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence

二、构造函数

    public StringBuilder() {
super(16);
} public StringBuilder(int capacity) {
super(capacity);
} public StringBuilder(String str) {
super(str.length() + 16);
append(str);
} public StringBuilder(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}

这也是为啥先学习AbstractStringBuilder的原因,大部分都是调用父类方法。

三、主要方法

对于常见的crud方法,都是使用的父类的相关方法操作。另外StringBuilder有两个private的方法

    private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
s.defaultWriteObject();
s.writeInt(count);
s.writeObject(value);
} private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
count = s.readInt();
value = (char[]) s.readObject();
}

这也就是StringBuilder的序列化以及反序列化。

StringBuffer

一、类定义

public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence

其他方法StringBuffer与StringBuilder基本一致,只是多了个synchronized关键字,用来保证线程安全,但是效率相对低一些。

走进JDK(三)------AbstractStringBuilder、StringBuffer、StringBuilder的更多相关文章

  1. Sring StringBuffer StringBuilder封装类

    Sring StringBuffer StringBuilder封装类 一.String类常见方法的使用 字符串数据都是一个对象 字符串数据一旦初始化就不可以被改变 字符串对象都存储于常量池中,字符串 ...

  2. [源码]String StringBuffer StringBudlider(2)StringBuffer StringBuilder源码分析

      纵骑横飞 章仕烜   昨天比较忙 今天把StringBuffer StringBulider的源码分析 献上   在讲 StringBuffer StringBuilder 之前 ,我们先看一下 ...

  3. 关于String StringBuffer StringBuilder

    0. String对象的创建       1.关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world&qu ...

  4. String StringBuffer StringBuilder (转)

    转自:http://www.iteye.com/topic/522167 众所周知,String是由字符组成的串,在程序中使用频率很高.Java中的String是一个类,而并非基本数据类型. 不过她却 ...

  5. String,StringBuffer,StringBuilder的区别及其源码分析

    String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...

  6. final,finally,finalize有什么区别?String, StringBuffer, StringBuilder有什么区别?Exception和Error有什么区别?

    继上篇JVM学习之后,后面将分三期深入介绍剩余JAVA基础面试题,每期3题. 题目一.final,finally,finalize有什么区别? /*请尊重作者劳动成果,转载请标明原文链接:*/ /* ...

  7. 深入理解String, StringBuffer, StringBuilder的区别(基于JDK1.8)

    String.StringBuffer.StringBuilder都是JAVA中常用的字符串操作类,对于他们的区别大家也都能耳熟能详,但底层到底是怎样实现的呢?今天就再深入分析下这三种字符串操作的区别 ...

  8. [置顶] String StringBuffer StringBuilder的区别剖析

    这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...

  9. 转:String StringBuffer StringBuilder区别

    转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸 ...

随机推荐

  1. JDBC、ODBC、OLE DB、ADO、ADOMD区别与联系

    ODBC: (Open Database Connectivity,开放数据库互连),它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口).这些API利用SQL来完成其大部分任务 ...

  2. linux服务器搭建

    centos7 java web项目环境搭配 2018年07月19日 17:20:21 阅读数:25 首先进行系统安装,此处不进行详细介绍,自行百度安装 一.配置ip地址信息 1.进入/etc/sys ...

  3. 细说SVN集中式版本控制器

    svn全称Subversion,实现多人开发同一个项目时,对源代码进行管理的工具.在公司里边,一个项目是由多人同时在开发,大家在本地自己电脑开发php代码,完毕后就commit上传给服务器运行.  如 ...

  4. ScrollView嵌套LinearLayout布局不能撑满全屏的问题

    当ScrollView里的元素想填满ScrollView时,使用"fill_parent"或者"match_parent"是不管用的,必需为ScrollView ...

  5. 微信小程序基础架构

    一个微信小程序界面由一个页面描述文件,一个页面逻辑文件,一个样式表文件来进行描述 在主目录中的三个以app开头的文件就是微信小程序的主描述文件 app.js :主逻辑文件,用来注册小程序 app.js ...

  6. [z]spring boot gradle build

    I had the same problem. I believe it is caused by the JRE that gradle is configured to use rather th ...

  7. Linux移植之auto.conf、autoconf.h、Mach-types.h的生成过程简析

    在Linux移植之make uImage编译过程分析中分析了uImage文件产生的过程,在uImage产生的过程中,顺带还产生了其它的一些中间文件.这里主要介绍几个比较关键的文件 1.linux-2. ...

  8. 内置函数 hashlib configparser logging 模块 C/S B/S架构

    1.内置函数 # 内置的方法有很多 # 不一定全都在object中 # class Classes: # def __init__(self,name): # self.name = name # s ...

  9. C++中的getline()

    总结: 尽量使用全局函数string类中的getline(),其读入的第二个参数为string类型,不设置默认是遇到回车停止读入操作 cin.getline是针对数组字符串的,以指定的地址为存放第一个 ...

  10. Java.FamousBlogs

    本文总结在工作/学习中发现的Java相关的blogs. 1. java code geeks (jcg) http://www.javacodegeeks.com/join-us/jcg/ 2. ht ...