0
点赞
收藏
分享

微信扫一扫

【Java笔记】String、StringBuffer、StringBuilder的不同之处

岛上码农 2022-04-05 阅读 47

java . lang . StringBuffer 与 java . lang . StringBuilder 代表可变的字符序列,分别在 JDK 1.0 与 JDK 1.5 中声明,可以对字符串内容进行增删,此时不会产生新的对象

目录

String、StringBuffer、StringBuilder的不同之处

String、StringBuffer、StringBuilder的源码分析

String的源码分析

StringBuffer与StringBuilder源码分析


String、StringBuffer、StringBuilder的不同之处

String:不可变的字符序列,底层使用 char[ ] 存储

StringBuffer:可变的字符序列,线程安全,效率相比 StringBuilder 较低,底层使用 char[ ] 存储

StringBuilder:可变的字符序列,线程不安全,效率相比 StringBuffer 较高,底层使用 char[ ] 存储

public class MyTest {
    public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer("abc");
        s1.append('1'); //StringBuffer 与 StringBuilder 都是可变的
        System.out.println(s1);
    }
}

>>> abc1

三者的效率从高到低为:StringBuilder > StringBuffer > String

String、StringBuffer、StringBuilder的源码分析

String的源码分析

因为 final,所以不可变性

String str = new String();
// 相当于 char[] value = new char[0];

StringBuffer与StringBuilder源码分析

因为 StringBuffer 与 StringBuilder 的源码相似,我们这里就分析 StringBuffer

StringBuffer sb1 = new StringBuffer();
//相当于char[] value = new char[16];
//在底层创建了一个长度为16的数组

如果 StringBuffer sb2 = new StringBuffer("abc"); 打印 sb2 . length,其长度为 3,不是 16

扩容问题:如果要添加的数据底层数组盛不下,那就需要扩容底层数组。默认情况下,扩容为原来容量的 2 倍 + 2,同时将原有数组中的元素复制到新的数组中

举报

相关推荐

0 条评论