StringBuilder 和 StringBuffer 的初始容量及扩容机制

 StringBuilder

默认容量大小:

1.无参数构造时,默认容量大小为16.

StringBuilder stb = new StringBuilder() // 默认初始大小16

StringBuilder 和 StringBuffer 的初始容量及扩容机制_第1张图片

 super父类的构造方法,传入16大小创造字符数组。

    /**
     * Creates an AbstractStringBuilder of the specified capacity.
     */
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

2.传入初始化大小 n 时,默认容量大小为 n

StringBuilder stb = new StringBuilder(11) // 默认大小就是自定义的 11

StringBuilder 和 StringBuffer 的初始容量及扩容机制_第2张图片

 

 3.传入字符串s进行初始化时, 默认容量大小为  s.length( ) + 16;

StringBuilder stb = new StringBuilder("123456") // 默认容量大小为 16 + 6

StringBuilder 和 StringBuffer 的初始容量及扩容机制_第3张图片

扩容机制 

StringBuilder默认扩容机制是 value.length() *2 + 2 . 

在进行添加append操作的时候会先判断容量大小是否可以存放新进的字符串长度,不够就进行扩容。

StringBuilder 和 StringBuffer 的初始容量及扩容机制_第4张图片


StringBuffer

默认容量大小以及扩容机制相同。

引入了 synchronized 关键字进行加锁操作,保证线程安全。

从下面代码可以看到其加锁操作在各个方法上面,对于字符数组char 没有进行 final 修饰,这是为了提高效率以及保证安全性总和考虑 就在方法上加了锁操作。

StringBuilder 和 StringBuffer 的初始容量及扩容机制_第5张图片

 char[ ] 字符数组没有进行final等机制。StringBuilder 和 StringBuffer 的初始容量及扩容机制_第6张图片

总结:

StringBuffer 和 StringBuilder 扩容机制相同,初始化容量机制相同。

两者安全性不同,效率不同,更多可以参考

String、StringBuilder、StringBuffer的四大区别解析_极品小學生的博客-CSDN博客

你可能感兴趣的:(java,开发语言,面试,职场和发展,java-ee)