走进JDK(三)------AbstractStringBuilder、StringBuffer、StringBuilder
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的更多相关文章
- Sring StringBuffer StringBuilder封装类
Sring StringBuffer StringBuilder封装类 一.String类常见方法的使用 字符串数据都是一个对象 字符串数据一旦初始化就不可以被改变 字符串对象都存储于常量池中,字符串 ...
- [源码]String StringBuffer StringBudlider(2)StringBuffer StringBuilder源码分析
纵骑横飞 章仕烜 昨天比较忙 今天把StringBuffer StringBulider的源码分析 献上 在讲 StringBuffer StringBuilder 之前 ,我们先看一下 ...
- 关于String StringBuffer StringBuilder
0. String对象的创建 1.关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world&qu ...
- String StringBuffer StringBuilder (转)
转自:http://www.iteye.com/topic/522167 众所周知,String是由字符组成的串,在程序中使用频率很高.Java中的String是一个类,而并非基本数据类型. 不过她却 ...
- String,StringBuffer,StringBuilder的区别及其源码分析
String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...
- final,finally,finalize有什么区别?String, StringBuffer, StringBuilder有什么区别?Exception和Error有什么区别?
继上篇JVM学习之后,后面将分三期深入介绍剩余JAVA基础面试题,每期3题. 题目一.final,finally,finalize有什么区别? /*请尊重作者劳动成果,转载请标明原文链接:*/ /* ...
- 深入理解String, StringBuffer, StringBuilder的区别(基于JDK1.8)
String.StringBuffer.StringBuilder都是JAVA中常用的字符串操作类,对于他们的区别大家也都能耳熟能详,但底层到底是怎样实现的呢?今天就再深入分析下这三种字符串操作的区别 ...
- [置顶] String StringBuffer StringBuilder的区别剖析
这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...
- 转:String StringBuffer StringBuilder区别
转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸 ...
随机推荐
- OSPF网络类型不一致路由无法计算的问题
晚上割接,远端的ASR9001-s网络类型为广播类型,本端为6509-e,网络接口类型修改成p2p后,OSPF邻居关系建立,但是路由无法计算.
- word 2016 加载 mathtype
1.加载wold: 首先打开word,选择选项-------加载项------管理(A),选择word加载项,点击转到 这儿显示的是我已经添加过的所以显示的有. 2.点击添加,找到你的mathtype ...
- elasticsearch查询语句总结
query 和 filter 的区别请看:https://www.cnblogs.com/bainianminguo/articles/10396956.html Filter DSL term 过 ...
- spring boot 2.0 与FASTDFS进行整合
只支持在spring-boot 2.0以及以上版本中使用 1.pom.xml 里引入FASTDFS的依赖,toobato与fastdfs作者一起,将fastdfs的功能进行了重构与简化 <!-- ...
- IEDriver executable needs to be available in the path
解决办法: 去http://selenium-release.storage.googleapis.com/index.html 下载指定IE版本 解压后 拷贝到Python的目录下 重新运行,提示错 ...
- sqlserver中为节约存储空间的收缩数据库机制
1.收缩数据库: 删除数据库的每个文件中已经分配单还没有使用的页,首座后数据库空间自动减少 2.收缩方式: (1)自动收缩数据库 选中数据库--->右击--->属性 在常规这里我们可以看到 ...
- Centos 7.0 Firewall-cmd 使用方式
开启端口命令 输入firewall-cmd --query-port=6379/tcp,如果返回结果为no,那么证明6379端口确实没有开启.输入firewall-cmd --add-port=637 ...
- Java并发-UncaughtExceptionHandler捕获线程异常信息并重新启动线程
Java并发-UncaughtExceptionHandler捕获线程异常信息并重新启动线程 一.捕获异常并重新启用线程 public class Testun { public static voi ...
- c# 线程启动while(true) 死循环,里边的return导致线程退出情况,查错
写了一个线程 线程下启动了一个循环 while(true) { 里边有个判断 如果为空不操作, 有余这个线程是后加的,老程序里边因为有个return没关注,导致线程退出而不能不听的监控 } 线程启动一 ...
- Oracle_PL/SQL(7) 集合
pl/sql集合处理单行单列数据,可以使用标量变量:处理单行多列的数据,可以使用pl/sql记录(%rowtype,record):处理单列多行数据,可以使用pl/sql集合. pl/sql集合类型是 ...