String、StringBuffer和StringBuilder的区别

1.String

String的底层是字符数组,由于字符数组被final修饰,所以String的长度是不可变的,并且String不可被更改,不可被继承,是线程安全的

 private final char value[];

2.StirngBuffer

StringBuffer继承自AbstractStringBuilder,在 AbstractStringBuilder 中也是使用字符数组保存字符串的, 但是字符数组没有被 final 关键字修饰,所以StirngBuffer长度是可变的
String、StringBuffer和StringBuilder的区别
由于StringBuffer的append方法被synchronized修饰,所以StringBuffer是线程安全的

    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }

3.StringBuilder

StringBuilder也是继承自AbstractStringBuilder,所以StringBuilder长度也是可变的。
由于StringBuilder的append方法没有被synchronized修饰,所以StringBuilder不是线程安全的

    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

注意:StringBuffer线程安全,StringBuilder线程不安全,别搞反了

在效率方面:因为StringBuffer很多方法都被synchronized修饰,同时刻只能有一个线程去执行一个方法,所以效率会比StringBuilder低一些

总结:

1.可变性: String长度不可变,StringBuffer和StringBuilder长度可变

2.安全性: String线程安全,StringBuffer线程安全,StringBuilder线程不安全

3.效率:StringBuffer效率低于StringBuilder

上一篇:BBR 拥塞控制算法blog笔记


下一篇:vslam十四讲 ch5踩坑记录