String、StringBuffer、StringBuilder的区别

a.可变不可变

首先String是不可改变的对象,可以理解为常量。StringBuffer和StringBuilder这两种对象都是可变的。
        1.String 底层使用一个不可变的字符数组 private final char value[],所以它内容不可变。String 为不可变对象,一旦被创建,就不能修改它的值。对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去。

        2.StringBuffer和StringBuilder都继承了AbstractStringBuilder底层使用的是可变字符数组:char[]value。StringBuffer:是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象 , 它只能通过构造函数来建立,  如: StringBuffer sb = new StringBuffer(); 不能通过赋值符号对他进行赋值。 如 sb = "welcome to here!";//error。对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中赋值的时候可以通过它的append()方法。   sb.append("hello");

b.线程安全

        String中的对象是不可变的,也就可以理解为常量, 显然线程安全 。

        因为StringBuffer的方法(如append()方法)是带同步锁(synchronized),因此StringBuffer线程是安全,但效率较低,StringBuilder线程是不安全的,但是效率较高。

@Override
    @HotSpotIntrinsicCandidate
    public synchronized StringBuffer append(int i) {
        toStringCache = null;
        super.append(i);
        return this;
    }
 @Override
    @HotSpotIntrinsicCandidate
    public StringBuilder append(int i) {
        super.append(i);
        return this;
    }

最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。效率比较String < StringBuffer < StringBuilder。所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值