1类签名与注释

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

一个可变的字符序列。 此类提供与StringBuffer相同的API,但不保证同步。在单线程中应该优先使用StringBuilder,因为它不需要同步,在大多数实现中将更快。

StringBuilder的主要实现是append与insert方法,他们是重载的,以便接受任何类型的数据。append方法始终在末尾添加字符,而insert方法在指定位置添加。

每个StringBuilder都有一个容量,只要StringBuilder中包含的字符序列的长度不超过容量,则不需要分配新的内部缓冲区。 如果内部缓冲区溢出,则会自动变大。

2基本属性

StringBuilder是通过char数组实现的,字符数组声明在其父类AbstractStringBuilder中,详情如下

//存储字符的数组
char[] value; //当前数组中已有字符的计数
int count;

注意区别count和value.length,前者是已有字符的计数,后者是StringBuilder的容量。

StringBuilder的默认初始化容量是16。

3 常用方法

(1)append方法

append方法实在StringBuilder的末尾添加字符。

StringBuilder的append方法是重载的,以便接受任何类型的数据。下面是append String的方法

//append String
public StringBuilder append(String str) {
super.append(str);
return this;
}
// 父类AbstractStringBuilder中具体实现
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;
}

append String时,首先会检查是否需要扩容(ensureCapacityInternal),然后调用String的getChars方法,将str的字符数组追加到value的后面,最后将当前的字符计数count加上str的长度。ensureCapacityInternal方法如下(AbstractStringBuilder中实现)

private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
} private int newCapacity(int minCapacity) {
// overflow-conscious code
int newCapacity = (value.length << 1) + 2;
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
? hugeCapacity(minCapacity)
: newCapacity;
} private int hugeCapacity(int minCapacity) {
if (Integer.MAX_VALUE - minCapacity < 0) { // overflow
throw new OutOfMemoryError();
}
return (minCapacity > MAX_ARRAY_SIZE)
? minCapacity : MAX_ARRAY_SIZE;
}

ensureCapacityInternal首先检查是否需要扩容,只有当count+str.length()的长度大于自身容量的情况下才需要扩容。

若扩容,则newCapacity方法决定扩容多少,最小扩容的新容量=旧容量*2+2,当这个值还小于count+str.length()时,新容量=count+str.length()

其他重载的append方法原理差不多,这里就不多说了。

(2)insert方法

insert方法可以在StringBuilder指定位置添加字符(串)

StringBuilder的insert方法是重载的,以便接受任何类型的数据。下面是在指定开始位置insert String的实现

//指定开始位置insert String
public StringBuilder insert(int offset, String str) {
super.insert(offset, str);
return this;
} //父类AbstractStringBuilder中具体实现
public AbstractStringBuilder insert(int offset, String str) {
if ((offset < 0) || (offset > length()))
throw new StringIndexOutOfBoundsException(offset);
if (str == null)
str = "null";
int len = str.length();
ensureCapacityInternal(count + len);
System.arraycopy(value, offset, value, offset + len, count - offset);
str.getChars(value, offset);
count += len;
return this;
}

底层还是调用System.arraycopy通过数组复制实现的。

(3)delete

(4)replace

最新文章

  1. Android ooVoo Apk附件关联分析
  2. unreal slate 创建 window
  3. 在sql脚本中获取变量中的查询结果
  4. Sequelize 关系模型简介
  5. 堆排序Heap sort
  6. 接着上一篇 《Is WPF dead》
  7. MongoDB学习(二)Windows环境安装MongoDB
  8. 【BZOJ-2809】dispatching派遣 Splay + 启发式合并
  9. MyBatis的两个配置文件
  10. 模拟美萍加密狗--Rockey2虚拟狗(一)
  11. MDCC为移动开发者服务:一看、一聊、一聚
  12. gitlab安装备忘录
  13. C#中,子类构造函数调用父类父类构造函数的正确方式
  14. 基于Java Instrument的Agent实现
  15. ES6躬行记(1)——let和const
  16. web自动化测试---概述
  17. 39.css3----button按钮点击时出现蓝色边框
  18. navicat Window . MAC版常用快捷键
  19. C++ 内连接与外连接 (转)
  20. C关系运算结果及逻辑运算结果保存

热门文章

  1. [Leetcode Week9]Word Break II
  2. HDU1018 (斯特林公式)
  3. camera驱动框架分析(下)
  4. git放弃本地commit,未push
  5. scrapy模拟知乎登录(无验证码机制)
  6. 【 Linux 】Linux套接字简要说明
  7. JavaScript的条件运算符与条件语句
  8. yum,httpd,php环境搭建方法
  9. PostgreSQL9.6.3的REDIS测试
  10. vijos P1234口袋的天空(Kruskal)(最小生成树)