title: 【学习之路】StringBuffer和StringBuilder
draft: true
tags:


StringBuffer和StringBuilder学习


StringBuffer、StringBuilder、String异同

  • String 不可变字符序列,底层使用char[]进行储存 不可变特性是final修饰的数组

  • StringBuffer 可变的字符序列;线程安全的,效率比StringBuilder低;底层使用char[]进行存储

  • StringBuilder 可变的字符序列;线程不安全的,是Java1.5版本新增;效率高,底层使用char[]进行存储

  • StringBuffer、Builder继承AbstractStringBuilder类,默认继承Object;实现接口java.io.Serializable, CharSequence

对象的构建

  • 无参数构造方法 构建一个默认长度16个空间的对象 char[]
    StringBuilder builder = new StringBuilder();

  • 利用给定的参数 构建一个自定义长度空间的对象 char[]
    StringBuilder builder = new StringBuilder(20);

  • 利用带String参数的构造方法 默认数组长度字符串长度+16个
    StringBuilder builder = new StringBuilder(“abc”);

StringBuffer、StringBuilder源码

  • StringBuffer线程安全是通过synchronized关键词来修饰的方法

StringBufferAndBuilder - 图1

  • StringBuffer、Builder底层调用了父类的构造方法进行传参默认长度为16

StringBufferAndBuilder - 图2

StringBufferAndBuilder - 图3

StringBufferAndBuilder - 图4

StringBuffer、Builder动态扩容原理

  1. 按住Ctrl点击ensureCapacityInternal这个方法

StringBufferAndBuilder - 图5

  1. 将当前的长度和所需要的长度进行判断如果长度不够就进入newCapacity方法进行扩容

StringBufferAndBuilder - 图6

  1. 将value.lenght左移位1再加上2的长度进行扩容扩容完成后再判断长度是否足够如果不够就使用minCapacity这个长度

StringBufferAndBuilder - 图7

StringBuffer、Builder是通过判断进行扩容再通过循环将数组的值进行移动,如果频繁扩容容易导致效率低下问题建议使用重载int Capacity的构造方法创建足够长度的数组

StringBuffer、Builder的常用方法

StringBufferAndBuilder - 图8

StringBufferAndBuilder - 图9