String StringBuilder StringBuffer区别

文章讨论了Java中String类的不可变性以及其效率和安全性的考量,然后对比了StringBuilder和StringBuffer两个可变字符串类的区别,包括线程安全性和性能差异。String通过new创建每次会生成新对象,而相同字符序列的String在字符串池中只有一份。StringBuilder是非线程安全的,适合单线程环境,而StringBuffer是线程安全的,但效率相对较低。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.String

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {

String 类型的字符串是常量,字符串创建出来后不允许修改;设置为final 主要是为了“效率” 和 “安全性” 的缘故;

        String str1 = "abc";
        String str2 = new String("abc");
        String str3 = "abc";
        LogUtil.i("str1==str2:" + (str1 == str2));//false
        LogUtil.i("str1==str3:" + (str1 == str3));//true

总结:

1.String通过new创建的字符串对象,每一次new都会申请一个内存空间,所以地址不同;

2.字符序列相同,jvm都只会建立一个String对象,并在字符串池中维护;

2.StringBuilder

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence {
    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

一个可变的字符串类,用的都是同一个地址,线程不安全;

        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = sb1.append("abc");
        StringBuilder sb3 = new StringBuilder("abc");
        StringBuilder sb4 = new StringBuilder("abc");
        LogUtil.i("sb1:" + sb1);//abc
        LogUtil.i("sb2:" + sb2);//abc
        LogUtil.i("sb1==sb2:" + (sb1 == sb2));//true
        LogUtil.i("sb3==sb4:" + (sb3 == sb4));//false

3.StringBuffer

 public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence {
    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }

一个可变的字符串类,用的都是同一个地址,线程安全;

        StringBuffer sbf1 = new StringBuffer();
        StringBuffer sbf2 = sbf1.append("abc");
        LogUtil.i("sbf1:" + sbf1);//abc
        LogUtil.i("sbf2:" + sbf2);//abc
        LogUtil.i("sbf1==sbf2:" + (sbf1 == sbf2));//true

总结

String
StringBuilder
StringBuffer
不可变可变可变
线程不安全线程安全
效率高效率低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值