String、StringBuffer、StringBuilder类的区别(日常问题——面)

目录

1.String 类

2.StringBuffer、StringBuilder类

3.总结

1.String 类

String类是一种不可改变对象,在设计是就是不可改变的,字符串中的内容是不可改变的,即字符串不可修改。在创建字符串变量之初就确定了。这是String类的部分代码:

我们可以看见String类中的字符实际保存在内部维护的value字符数组中,value被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。String类对象的修改其实是创建了一个新的对象,将值传给新的对象,改变的是新的对象的值,通过这种方式来改变String对象。

注意:final 修饰类表明该类不想被继承, final 修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内 容是可以修改的。如果是final修饰的是一个基本数据类型,那么这个变量的值就确定了,如果fianl修饰的是一个引用类型,因为引用类型在堆中存的是地址,所以这个变量的地址就确定了,但是确定的地址指向的那个值还可以改变!!!所以不是简单的说String修饰的字符串不能改变是因为其内部保存字符的数组被 final 修饰了,因此不能改变,这种说法是错误的!!

2.StringBuffer、StringBuilder类

其实StringBuffer、StringBuilder类方法基本相似(具体的方法根据自己的需求自行去网址查看:https://docs.oracle.com/javase/8/docs/api/),具体的区别就是是否采用同步处理。

StringBuffer采用的同步处理、StringBuilder未采用同步处理,而是否采用同步处理关系到线程安全操作。在实际情况中我们往往会遇到多个线程共享或者修改数据,如果数据不同,可能会出现安全问题,为了避免出现不必要的危险,必须保证数据实时更新,就有了锁同步处理,然StringBuilder没有锁同步处理,因此是不同步处理的,也就是非线程安全的。此外为了保证安全,我们需要同步操作,肯定性能会降低。
因此,我们得出结论:
1:单线程用StringBuilder,性能高;多线程用StringBuffer,性能低;
2:StringBuilder是非线程安全的,StringBuffer是线程安全的。

3.总结

1.String的内容不能修改,StringBuffer、StringBuilder的内容可以修改,频繁修改字符串考虑StringBuilder、StringBuffer。如果想要String与其转换,可以将String转化为StringBuilder,利用构造方法或append()方法;StringBuilder转化为String可以调用toString()方法。

2.StringBuffer、StringBuilder两者方法基本相似,主要区别就是StringBuffer是多线程同步处理的,是线程安全的,StringBuilder是单线程非同步处理的,是非线程安全的。

3.String内容修改需要创建新的对象,效率是非常慢的,因此:尽量避免对String的直接修改需要,如果要修改建议尽量使用StringBuffer或者StringBuilder

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值