首先看一下他们的继承关系
 

这个两个对象都继承了AbstractStringBuilder抽象类。
 
1.他们的实现方式都一样的,唯一区别的StringBuffer在多线程的时候是保证了数据安全,每个方法都加上synchronize关键字,让线程同步。
 
2.从初始化开始看StringBuffer 有三个构造函数。
(1) 第一个是无参的构造函数 ,默认调用AbstractStringBuilder的构造函数,将一个大小为16长度的char数组赋值给父类的value值。
(2)第二个是int类型的参数,表示将一个大小为int参数的char数组赋值给父类的value值。
(3)第三个是String类型。表示将一个大小为16的加上参数字符串长度的大小的char数组赋值给value值。
3.StringBuffer和StringBuilder类里我们最常用的事append方法,都在父类里实现了。我们最常用的是append一个字符串。
初始化父类的value值是一个大小为16的char数组,count为0.
当我们append一个字符串时,默认调用父类的append方法。源码如下:
 
count值是append的累加。也就是当前加入的字符串的长度。每次累加都拼接在后面。这里用了getChars()实现。这里主要是看ensureCpacityInternel() 字面上检查容量是否正常。源码如下:
意思很明显,初始化的长度不够了要进行扩充了,将原来的value值放在新的char数组同时又赋给value值。源码如下:
 
大意为: 把初始化的长度扩充为左位移运算1 也就是乘以2再加2的长度。如果扩从的长度还是小于你入参的长度 那就入参的长度当做我char数组的长度。最后返回的时候又校验长度如果小于等于0或者入参长度大于定义的默认最大长度Integer.MAX_VALUE - 8,那就抛出内存溢出异常。
 
总结:
1.StringBuffer和StringBuilder append()的时候参数的大小是有限制的。
2.构造函数的大小将决定char数组扩容的基数。

StringBuffer 和Stringbuilder源码分析的更多相关文章

  1. String、StringBuffer、StringBuilder源码分析

    利用反编译具体看看"+"的过程 1 public class Test 2 { 3 public static void main(String[] args) 4 { 5 int ...

  2. [源码]String StringBuffer StringBudlider(2)StringBuffer StringBuilder源码分析

      纵骑横飞 章仕烜   昨天比较忙 今天把StringBuffer StringBulider的源码分析 献上   在讲 StringBuffer StringBuilder 之前 ,我们先看一下 ...

  3. String,StringBuffer,StringBuilder源码分析

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

  4. String,StringBuffer和StringBuilder源码解析[基于JDK6]

    最近指导几位新人,学习了一下String,StringBuffer和StringBuilder类,从反馈的结果来看,总体感觉学习的深度不够,没有读出东西.其实,JDK的源码是越读越有味的.下面总结一下 ...

  5. Stringbuffer与Stringbuilder源码学习和对比

    >>String/StringBuffer/StringBuilder的异同 (1)相同点观察源码会发现,三个类都是被final修饰的,是不可被继承的.(2)不同点String的对象是不可 ...

  6. String、StringBuffer、StringBuilder源码解读

    序 好长时间没有认真写博客了,过去的一年挺忙的.负责过数据库.线上运维环境.写代码.Code review等等东西挺多. 学习了不少多方面的东西,不过还是需要回归实际.加强内功,方能扛鼎. 去年学习M ...

  7. String、StringBuffer和StringBuilder源码解析

    1.String 1.1类的定义 public final class String implements java.io.Serializable, Comparable<String> ...

  8. java.lang.StringBuilder源码分析

    StringBuilder是一个可变序列的字符数组对象,它继承自AbstractStringBuilder抽象类.它不保证同步,设计出来的目的是当这个字符串缓存只有单线程使用的时候,取代StringB ...

  9. [源码分析]StringBuilder

    [源码分析]StringBuilder StringBuilder是继承自AbstractStringBuilder的. 这里附上另外两篇文章的连接: AbstractStringBuilder :  ...

随机推荐

  1. minicom - 友好易用的串口通信程序

    总览 SYNOPSIS minicom [-somMlwz8] [-c on|off] [-S script] [-d entry] [-a on|off] [-t term] [-p pty] [- ...

  2. 多线程 - 内存屏障和cpu缓存

    CPU性能优化 - 缓存 为了提高程序运行的性能,现代CPU在很多方面会对程序进行优化.CPU的处理速度是很快的,内存的速度次之,硬盘速度最慢.在cpu处理内存数据中,内存运行速度太慢,就会拖累cpu ...

  3. 03python面向对象编程1

    1.创建和使用类 1.1 创建 Dog 类.根据 Dog 类创建的每个实例都将存储名字和年龄.我们赋予了每条小狗蹲下( sit() )和打滚( roll_over() )的能力: In [2]: cl ...

  4. UVa10426

    GCD Extreme(II) Input: Standard Input Output: Standard Output Given the value of N, you will have to ...

  5. webpack Entrypoint undefined = index.html

    报错: module.exports增加配置stats: { children: false }即可解决:

  6. python 小游戏,和电脑玩剪刀石头布

    # -*- coding: utf-8 -*- """ Created on Fri Oct 25 16:28:12 2019 if判断综合演练,剪刀石头布 @autho ...

  7. Move Controller UE4键位

    工作中需要,就总结了一下,如下图:

  8. Java关于Files. walkFileTree()

    1.使用Files. walkFileTree()找出指定文件夹下所有扩展名为.txt和.java的文件. package text_001; import java.io.IOException; ...

  9. es之分词器和分析器

    Elasticsearch这种全文搜索引擎,会用某种算法对建立的文档进行分析,从文档中提取出有效信息(Token) 对于es来说,有内置的分析器(Analyzer)和分词器(Tokenizer) 1: ...

  10. 大数据笔记(二十一)——NoSQL数据库之Redis

    一.Redis内存数据库 一个key-value存储系统,支持存储的value包括string(字符串).list(链表).set(集合).zset(sorted set--有序集合)和hash(哈希 ...