StringBuilder是一个可变序列的字符数组对象,它继承自AbstractStringBuilder抽象类。它不保证同步,设计出来的目的是当这个字符串缓存只有单线程使用的时候,取代StringBuffer的。建议使用它而不是StringBuffer,因为它的速度更快。

StringBuilder有自己的容量(字符数组),当容量还没有被占满的时候,不必申请新的空间,当容量被占满后,它会自动地扩容。

public final class StringBuilder extends AbstractStringBuilder
implements java.io.Serializable, CharSequence {
public StringBuilder() {//构造方法只是调用父类的构造器
super(16);
} public StringBuilder(int capacity) {//capacity指定容量大小
super(capacity);
} public StringBuilder(String str) {//str指定初始容器存放的字符串,容量是str.length+16
super(str.length() + 16);
append(str);
} public StringBuilder(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}

  //StringBuilder重载了父类所有的append方法,以支持添加任何类型的数据到容器中
@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
} @Override
public StringBuilder append(String str) {
super.append(str);
return this;
} public StringBuilder append(StringBuffer sb) {
super.append(sb);
return this;
} @Override
public StringBuilder append(CharSequence s) {
super.append(s);
return this;
} public StringBuilder append(CharSequence s, int start, int end) {
super.append(s, start, end);
return this;
} @Override
public StringBuilder append(char[] str) {
super.append(str);
return this;
} //...更多的append重载方法,实现在StringBuilder append所有数据类型 public StringBuilder appendCodePoint(int codePoint) {//这个方法是通过Unicode编码来append一个字符,比如'a'的Unicode=97,appendCodePoint(97)相当于把a添加到容器末尾
super.appendCodePoint(codePoint);
return this;
} public StringBuilder delete(int start, int end) {//删除end-start的子串
super.delete(start, end);
return this;
} public StringBuilder deleteCharAt(int index) {//删除index下标的字符
super.deleteCharAt(index);
return this;
} public StringBuilder replace(int start, int end, String str) {//用str取代end-start的子串
super.replace(start, end, str);
return this;
}

  //insert方法实现在字符串的任意位置插入数据
public StringBuilder insert(int index, char[] str, int offset,
int len)
{
super.insert(index, str, offset, len);
return this;
}
//...更多的insert重载方法 public int indexOf(String str) {//找到子串的起始位置
return super.indexOf(str);
}
//...更多的indexOf重载方法,实现找到子串的位置 public StringBuilder reverse() {//将容器内的字符串倒转
super.reverse();
return this;
} public String toString() {//toString是返回new一个String对象
// Create a copy, don't share the array
return new String(value, 0, count);
} private void writeObject(java.io.ObjectOutputStream s)//writeObeject提供序列化机制
throws java.io.IOException {
s.defaultWriteObject();
s.writeInt(count);
s.writeObject(value);
} private void readObject(java.io.ObjectInputStream s)//readObject提供反序列化机制
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
count = s.readInt();
value = (char[]) s.readObject();
}
}

StringBuilder内部维护一个字符数组,在这个字符数组上对字符进行各种操作,当需要对字符串进行频繁操作时,StringBuilder能提供很好的性能,比起直接操作String,它不需要创建很多对象。

java.lang.StringBuilder源码分析的更多相关文章

  1. java.lang.StringBuffer源码分析

    StringBuffer是一个线程安全的可变序列的字符数组对象,它与StringBuilder一样,继承父类AbstractStringBuilder.在多线程环境中,当方法操作是必须被同步,Stri ...

  2. java.lang.ThreadLocal源码分析

    ThreadLocal类提供线程本地变量,为变量在每个线程创建一个副本,每个线程可以访问自己内部的副本变量. 比如,有这样一个需求,需要为每个线程创建一个独一无二的标识,这个标识在第一次调用Threa ...

  3. java.lang.Runnable 源码分析

    子接口:RunnableFuture<V>, RunnableScheduledFuture<V> 实现类:AsyncBoxView.ChildState, ForkJoinW ...

  4. Java split方法源码分析

    Java split方法源码分析 public String[] split(CharSequence input [, int limit]) { int index = 0; // 指针 bool ...

  5. 【JAVA】ThreadLocal源码分析

    ThreadLocal内部是用一张哈希表来存储: static class ThreadLocalMap { static class Entry extends WeakReference<T ...

  6. 【Java】HashMap源码分析——常用方法详解

    上一篇介绍了HashMap的基本概念,这一篇着重介绍HasHMap中的一些常用方法:put()get()**resize()** 首先介绍resize()这个方法,在我看来这是HashMap中一个非常 ...

  7. 【Java】HashMap源码分析——基本概念

    在JDK1.8后,对HashMap源码进行了更改,引入了红黑树.在这之前,HashMap实际上就是就是数组+链表的结构,由于HashMap是一张哈希表,其会产生哈希冲突,为了解决哈希冲突,HashMa ...

  8. 细说并发5:Java 阻塞队列源码分析(下)

    上一篇 细说并发4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...

  9. String,StringBuffer,StringBuilder源码分析

    1.类结构 String Diagrams StringBuffer Diagrams StringBuilder Diagrams 通过以上Diagrams可以看出,String,StringBuf ...

随机推荐

  1. iOS开发-自动布局和自动旋转

    今天学习自动布局中的自动调整尺寸大小. 一.尺寸分类 尺寸分类是对设备宽高的一种大致分类. 有两种具体的尺寸分类用来表示真机:紧凑(Compact)和标准(Regular).还有第三种分类可以在设计工 ...

  2. 【转】C++及java在内存分配上的区别

    转自:http://blog.csdn.net/qinghezhen/article/details/9116053 C++内存分配由五个部分组成:栈.堆.全局代码区.常量区.程序代码区.如下图所示: ...

  3. 从零开始学android开发-Json转换利器Gson之实例

    Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. jar和源码下载地址: h ...

  4. PHP strpos() 函数

    定义和用法 strpos() 函数返回字符串在另一个字符串中第一次出现的位置. 如果没有找到该字符串,则返回 false. 语法 strpos(string,find,start) 参数 描述 str ...

  5. 2015北京网络赛 H题 Fractal 找规律

    Fractal Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc2015beijingo ...

  6. unity3D中协程和线程混合

    这是我google unity3D一个问题偶然发现的在stackflow上非常有趣的帖子: 大意是 要在unity3D上从server下载一个zip,并解压到持久化地址.并将其载入到内存中.以下展示了 ...

  7. node.js在windows下的学习笔记(10)---URL模块

    1.parse函数的作用是解析url,返回一个json格式的数组 url.parse('http://www.zjut.edu.cn'); { protocol: 'http:', slashes: ...

  8. Android下实现GPS定位服务

    1.申请Google API Key,参考前面文章 2.实现GPS的功能需要使用模拟器进行经纬度的模拟设置,请参考前一篇文章进行设置 3.创建一个Build Target为Google APIs的项目 ...

  9. iOS开发——OC篇&协议篇/NSCoder/NSCoding/NSCoping

    协议篇/NSCoder/NSCoding/NSCoping 协议声明类需要实现的的方法,为不同的类提供公用方法,一个类可以有多个协议,但只能有一个父类,即单继承.它类似java中的接口. 正式协议(f ...

  10. maven系列之二maven项目的创建和maven项目的结构

    maven系列之一简单介绍了maven的基本信息,安装和配置,大家对maven有一个大概的了解,但是在maven项目开发中远远不够,为了进一步了解maven,现在我们介绍maven项目的创建和mave ...