[源码分析]StringBuffer
StringBuffer是继承自AbstractStringBuilder的.
这里附上另外两篇文章的连接:
AbstractStringBuilder : http://www.cnblogs.com/noKing/p/9427967.html
StringBuilder : http://www.cnblogs.com/noKing/p/jdk8_StringBuilder.html
构造器
我每篇文章都说. 请忽略我的"My". 我copy了jdk的代码, 然后把StringBuffer改为了MyStringBuffer. 核心源码不会改动的.
构造器和StringBuilder里的一样. 不过还是再贴出来吧.
无参构造器是默认的大小为16.
或者可以直接给定大小. 来规定初始化时的数组大小.
如果是根据传入字符串来构造的, 那么初始大小就是: 传入的字符串长度+16.
其他常用方法
以reverse为例吧.
1. 常用的方法基本都是调用的父类的
2. 方法声明上多了synchronized修饰符
3. 多了一行toStringCache = null. (这个下面待会儿再讲)
4. return this是和StringBuilder一样的, 都有这段代码.
toString方法
我们打开StringBuffer源码, 第一眼就可以看到这个字段
英文注释也说得很清楚. 这个toStringCache字段是为了作缓存的.
缓存什么呢? 缓存最后一次toString的内容. 当被修改的时候这个cache清空.
也就是说, 如果没被修改, 那么这个toStringCache就是上一次toString的结果.
没被修改的时候, 就可以直接把toStringCache作为new String的参数. 然后把这个String返回就行了.
也就是cache有效的时候, 就不必进行arraycopy的复制操作. cache失效了才进行arraycopy的复制操作.
Stack Overflow 里也有这个问题 Why StringBuffer has a toStringCache while StringBuilder not?
toString方法代码如下:
里面的String构造器的源码如下:
总结
1. 构造的大小和16相关. 要么是16, 要么就是加16.(除非使用了定制数组大小的那个构造器, 也就是 本文中截图的第二个构造器. 那么就是指定多大, 初始数组就是多大了.)
2. 实现了toString方法. 内部实现就是每次toString都是new一个String对象.
3. 其他方法都是调用的父类的方法. 只是多加了一行return this;
4. 方法上加了synchronized修饰符来保证线程安全.
5. 有一个我觉得没什么作用的toStringCache数组....
[源码分析]StringBuffer的更多相关文章
-
[源码]String StringBuffer StringBudlider(2)StringBuffer StringBuilder源码分析
纵骑横飞 章仕烜 昨天比较忙 今天把StringBuffer StringBulider的源码分析 献上 在讲 StringBuffer StringBuilder 之前 ,我们先看一下 ...
-
String、StringBuffer、StringBuilder源码分析
利用反编译具体看看"+"的过程 1 public class Test 2 { 3 public static void main(String[] args) 4 { 5 int ...
-
String,StringBuffer,StringBuilder源码分析
1.类结构 String Diagrams StringBuffer Diagrams StringBuilder Diagrams 通过以上Diagrams可以看出,String,StringBuf ...
-
cglib源码分析(一): 缓存和KEY
cglib是一个java 字节码的生成工具,它是对asm的进一步封装,提供了一系列class generator.研究cglib主要是因为它也提供了动态代理功能,这点和jdk的动态代理类似. 一. C ...
-
【Zookeeper】源码分析之网络通信(二)
一.前言 前面介绍了ServerCnxn,下面开始学习NIOServerCnxn. 二.NIOServerCnxn源码分析 2.1 类的继承关系 public class NIOServerCnxn ...
-
【Zookeeper】源码分析之网络通信(三)
一.前言 前面已经学习了NIOServerCnxn,接着继续学习NettyServerCnxn. 二.NettyServerCnxn源码分析 2.1 类的继承关系 public class Netty ...
-
深入理解分布式调度框架TBSchedule及源码分析
简介 由于最近工作比较忙,前前后后花了两个月的时间把TBSchedule的源码翻了个底朝天.关于TBSchedule的使用,网上也有很多参考资料,这里不做过多的阐述.本文着重介绍TBSchedule的 ...
-
[源码分析]StringBuilder
[源码分析]StringBuilder StringBuilder是继承自AbstractStringBuilder的. 这里附上另外两篇文章的连接: AbstractStringBuilder : ...
-
[源码分析]AbstractStringBuilder
[源码分析]AbstractStringBuilder Java中, AbstractStringBuilder是 StringBuilder 和 StringBuffer 的父类. 所以了解Stri ...
随机推荐
-
Windows Azure HDInsight 使用技巧
Windows Azure HDInsight是一个面向大数据的PaaS服务,是PaaS版本的Hadoop.HDInsight是微软与Hortonworks合作的产物.可以理解为Hortonworks ...
-
PHP正则表达式提取超链接及其标题
有这么一段HTML,比较不规则的,如果要提取其中的链接地址和链接名称,怎么弄? //HTML$str = ''<a id="top8" href="http://l ...
-
hdu 1010:Tempter of the Bone(DFS + 奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
-
CCS5 建立SYS/BIOS工程时报错“cannot find file ";./configPkg/linker.cmd"; bios”的解决方法
CCS5 建立SYS/BIOS工程时报错“cannot find file "./configPkg/linker.cmd" bios”的解决方法 报错 #10008-D cann ...
-
Swift - 30 - 可变参数
//: Playground - noun: a place where people can play import UIKit // 可变参数一定要放在所有定义参数的最后面, 和其他参数的定义方式 ...
-
centos 添加用户
测试环境:CentOS 6.0 1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户 #passwd tommy // ...
-
Vim -&;gt; 边确认边查找替换
进行简单的全局查找替换的时候,能够使用ex的例如以下命令 :%s/which/what/g 它的使用方法比較简单 % 表示每一行(everyline) s 替换(substitue) which 查找 ...
-
Postman几种常用方式
Postman几种常用方式 1.get请求直接拼URL形式 对于http接口,有get和post两种请求方式,当接口说明中未明确post中入参必须是json串时,均可用url方式请求 参数既可以写到U ...
-
Go 语言变量作用域
作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围. Go 语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量 函数外定义的变量称为全局变量 函数定义中的变量称为形式 ...
-
稀疏矩阵 part 1
▶ 图片参考[http://www.bu.edu/pasi/files/2011/01/NathanBell1-10-1000.pdf] ▶ 各种系数矩阵的数据结构 ● MAT,原始矩阵数据 type ...