Java中String,StringBuilder, StringBuffer区别
1.可变性
String是不可变的字符序列:String类中使用字符数组保存字符串,因为有“final”修饰符,所以String是不可变的
StringBuffer和StringBuilder是可变的字符序列,由于继承了AbstractStringBuilder父类,他们的属性也都相同,是可变字符序列
2.线程安全性
由于String是被final修饰的不可变序列,所以String是线程安全的
StringBuffer和StringBuilder虽都继承了AbstractStringBuilder父类,方法相同,但StringBuffer在方法上加synchronized关键字,对方法加了同步锁或者对调用的方法加了同步锁,所以StringBuffer是线程安全的
StringBuilder不保证同步,字符串运算方法不是同步的,用于在单线程下做StringBuffer的替代品,所以StringBuilder是线程不安全的
3.性能方面
一般情况下(单线程),StringBuilder > StringBuffer > String
由于StringBuffer要给方法加同步锁的原因,所以StringBuilder要慢一些
String频繁修改对象,会产生大量的新的对象,浪费资源
特殊情况例如:
String s1="123"+"456"+"789"; //实际相当于String s1="123456789";
StringBuilder s2=new StringBuilder("123"); //StringBuilder不断地append追加会慢于String
s2.append("456").append("789")
4.存储方面
String类型存储在常量池中,StringBuffer和StringBuilder存储在堆中
StringBuilder和StringBuilder操作时都是返回的他本身,而不是产生新对象,
补充:
相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,才可以采用 StringBuilder;否则还是用 StringBuffer。
StringBuilder提供与StringBuffer兼容的API,但是不保证同步,此类设计用于在单线程下做StringBuffer的替代品,单线程情况下,简易优先使用此类而不是StringBuffer,因为它的字符串运算方法不是同步的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix