title: 【学习之路】StringBuffer和StringBuilder
draft: true
tags:
- 学习之路
- Java
categories: - JavaSE
- String
cover: https://cdn.jsdelivr.net/gh/CodeZixuan/Blog_Images/83390357-44e72b80-a424-11ea-93d0-c5f701c8fc42.jpg
abbrlink: 16785
date: 2020-06-01 17:05:45
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关键词来修饰的方法
- StringBuffer、Builder底层调用了父类的构造方法进行传参默认长度为16
StringBuffer、Builder动态扩容原理
- 按住Ctrl点击ensureCapacityInternal这个方法
- 将当前的长度和所需要的长度进行判断如果长度不够就进入newCapacity方法进行扩容
- 将value.lenght左移位1再加上2的长度进行扩容扩容完成后再判断长度是否足够如果不够就使用minCapacity这个长度
StringBuffer、Builder是通过判断进行扩容再通过循环将数组的值进行移动,如果频繁扩容容易导致效率低下问题建议使用重载int Capacity的构造方法创建足够长度的数组