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

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

  1. public final class StringBuilder extends AbstractStringBuilder
  2. implements java.io.Serializable, CharSequence {
  3. public StringBuilder() {//构造方法只是调用父类的构造器
  4. super(16);
  5. }
  6.  
  7. public StringBuilder(int capacity) {//capacity指定容量大小
  8. super(capacity);
  9. }
  10.  
  11. public StringBuilder(String str) {//str指定初始容器存放的字符串,容量是str.length+16
  12. super(str.length() + 16);
  13. append(str);
  14. }
  15.  
  16. public StringBuilder(CharSequence seq) {
  17. this(seq.length() + 16);
  18. append(seq);
  19. }

  20.   //StringBuilder重载了父类所有的append方法,以支持添加任何类型的数据到容器中
  21. @Override
  22. public StringBuilder append(Object obj) {
  23. return append(String.valueOf(obj));
  24. }
  25.  
  26. @Override
  27. public StringBuilder append(String str) {
  28. super.append(str);
  29. return this;
  30. }
  31.  
  32. public StringBuilder append(StringBuffer sb) {
  33. super.append(sb);
  34. return this;
  35. }
  36.  
  37. @Override
  38. public StringBuilder append(CharSequence s) {
  39. super.append(s);
  40. return this;
  41. }
  42.  
  43. public StringBuilder append(CharSequence s, int start, int end) {
  44. super.append(s, start, end);
  45. return this;
  46. }
  47.  
  48. @Override
  49. public StringBuilder append(char[] str) {
  50. super.append(str);
  51. return this;
  52. }
  53.  
  54. //...更多的append重载方法,实现在StringBuilder append所有数据类型
  55.  
  56. public StringBuilder appendCodePoint(int codePoint) {//这个方法是通过Unicode编码来append一个字符,比如'a'的Unicode=97,appendCodePoint(97)相当于把a添加到容器末尾
  57. super.appendCodePoint(codePoint);
  58. return this;
  59. }
  60.  
  61. public StringBuilder delete(int start, int end) {//删除end-start的子串
  62. super.delete(start, end);
  63. return this;
  64. }
  65.  
  66. public StringBuilder deleteCharAt(int index) {//删除index下标的字符
  67. super.deleteCharAt(index);
  68. return this;
  69. }
  70.  
  71. public StringBuilder replace(int start, int end, String str) {//用str取代end-start的子串
  72. super.replace(start, end, str);
  73. return this;
  74. }

  75.   //insert方法实现在字符串的任意位置插入数据
  76. public StringBuilder insert(int index, char[] str, int offset,
  77. int len)
  78. {
  79. super.insert(index, str, offset, len);
  80. return this;
  81. }
  82. //...更多的insert重载方法
  83.  
  84. public int indexOf(String str) {//找到子串的起始位置
  85. return super.indexOf(str);
  86. }
  87. //...更多的indexOf重载方法,实现找到子串的位置
  88.  
  89. public StringBuilder reverse() {//将容器内的字符串倒转
  90. super.reverse();
  91. return this;
  92. }
  93.  
  94. public String toString() {//toString是返回new一个String对象
  95. // Create a copy, don't share the array
  96. return new String(value, 0, count);
  97. }
  98.  
  99. private void writeObject(java.io.ObjectOutputStream s)//writeObeject提供序列化机制
  100. throws java.io.IOException {
  101. s.defaultWriteObject();
  102. s.writeInt(count);
  103. s.writeObject(value);
  104. }
  105.  
  106. private void readObject(java.io.ObjectInputStream s)//readObject提供反序列化机制
  107. throws java.io.IOException, ClassNotFoundException {
  108. s.defaultReadObject();
  109. count = s.readInt();
  110. value = (char[]) s.readObject();
  111. }
  112. }

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. RGB配色表

    RGB配色表 查找请按 Ctrl+f 实效 英文名称 RGB 16色   Snow 255 250 250 #FFFAFA   GhostWhite 248 248 255 #F8F8FF   Whi ...

  2. unity3D中协程和线程混合

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

  3. Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量

    对所有用户有效在/etc/profile增加以下内容.只对当前用户有效在Home目录下的.bashrc或.bash_profile里增加下面的内容:(注意:等号前面不要加空格,否则可能出现 comma ...

  4. spring源码分析之spring-web http详解

    spring-web是spring webmvc的基础,它的功能如下: 1. 封装http协议中client端/server端的request请求和response响应及格式的转换,如json,rss ...

  5. 解读eXtremeComponents代码结构--转载

    原文地址:http://blog.csdn.net/lark3/article/details/1937466 大致整理了去年写的东西,罗列如下: ec是一系列提供高级显示的开源JSP定制标签,当前的 ...

  6. 网络请求OkHttp的使用

     okHttp: 1.okHttp是squere公司出的,在Android4.0以后盛行 2.httpClient 在5.0中弃用,在6.0以Google的sdk中没有该api 3.httpUrlCo ...

  7. MAC 环境下初始化mysql root 密码

    1. 关掉mysql服务,打开系统设置最后的mysql,然后将mysql先关掉 2. 生成一个文件命名mysql-init,文件中放入:一句话,这句话不同版本不一样,如下:(括号里面不包含) alte ...

  8. Flume简介与使用(三)——Kafka Sink消费数据之Kafka安装

    前面已经介绍了如何利用Thrift Source生产数据,今天介绍如何用Kafka Sink消费数据. 其实之前已经在Flume配置文件里设置了用Kafka Sink消费数据 agent1.sinks ...

  9. angualrjs学习总结三(http、select、表格、指令以及事件)

    一:http XMLHttpRequest:$http是angularjs的一个核心服务,用于读取远程服务器的数据.$http.get(url) 是用于读取服务器数据的函数.举例:<div ng ...

  10. Java内存模型——可见性

    /** * 可见性问题 * @author Snway * */public class Visibility {        private static boolean stop;        ...