String和StringBuffer,StringBuilder的区别

可变性上

String字符串的本质,就是在String类内部维护了一个字符数组

/** The value is used for character storage. */
    private final char value[];

并且这个数组被final修饰,因此String是不可变对象
而StringBuffer和StringBuilder都继承于AbstractStringBuilder,不过AbstractStringBuilder内的字符数组是没有被final修饰的:

 /**
     * The value is used for character storage.
     */
    char[] value;

因此StringBuffer和StringBuilder对象是可变的

线程安全上

由于String是不可变的,很显然String类是线程安全的,而StringBuffer和StringBuilder都继承于AbstractStringBuilder的一些公共方法,不过在重写时,StringBuffer对这些方法加了同步锁:

@Override
    public synchronized int length() {
        return count;
    }

    @Override
    public synchronized int capacity() {
        return value.length;
    }


    @Override
    public synchronized void ensureCapacity(int minimumCapacity) {
        super.ensureCapacity(minimumCapacity);
    }
性能上

由于String类是不可变对象,每次我们对String对象进行改变时,实际上都是生成新的String对象

String a="a";
a=a+"bc";

执行以上操作,生成新的String对象,对象内容为"abc"。
背后的原理:
这段代码运行时,编译器会创建一个java.lang.StringBuilder对象,然后会调用StringBuilder对象的append方法,把"a"和"bc"链接起来,最后在调用toString方法,转为String对象
在性能方面,StringBuffer和StringBuilder可以对自身内容进行操作,性能相比String类会好点,不过由于StringBuffer是线程安全的,性能相比StringBuilder会差点。

小结
  • StringBuffer类和StringBuilder类的对象调用toString()方法将转换为String类型

  • 可以直接将字符串“xxx”复制给声明的Stirng类,而StringBuilder类和StringBuffer类不行
    只能通过构造函数来建立
    StringBuffer sb = new StringBuffer();
    !!!:不能通过赋值符号对他进行付值
    sb = “welcome to here!”;//error
    对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
    中赋值的时候可以通过它的append方法.
    sb.append(“hello”);

    String str = new String("welcome to ");
    str += "here"的处理步骤实际上是通过建立一个StringBuffer,然后调用append(),最后
    再将StringBuffer toSting()(toString方法:StringBuffer类型转化成String类型);

  • StringBuffer类和StringBuilder类的对象调用toString()方法返回String类型对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值