String,StringBuilder,StringBuffer 区别,竟有这么多不同
🍁 作者:知识浅谈,CSDN 博客专家,阿里云签约博主,InfoQ 签约博主,华为云云享专家
📌 擅长领域:全栈工程师、爬虫、ACM 算法
💒 公众号:知识浅谈
从源代码看 String,StringBuilder,StringBuffer 区别🤞这次以 JDK1.8 的版本,Jdk1.8 以上底层数组采用了 byte🤞
正菜来了⛳⛳⛳
🎈区别一:安全相关
String 和 StringBuilder 是线程不安全的;
StringBuffer 是线程安全的。
为何?因为 StringBuffer 在 append,delete,等等方法上加了 synchronized 锁,所以就是线程安全的。这里拿出底层实现的几个方法:
🎈区别二:动态数组相关
String 不可动态扩容;
StringBuilder 和 StringBuffer 可以动态扩容。
🏹String 底层使用的是 final 修饰的常量数组所以其大小是不可变的。
🏹StringBuilder 和 StringBuffer 是可变的原因:因为 StringBuilder 和 StringBuffer 都是继承了抽象类 AbstractStringBuilderAbstractStringBuilder 内部使用的是字符数组非常量,也就是可变的。
初始化的时候默认的长度为 16。
StringBuilder 和 StringBuffer 还有一个区别:StringBuffer 比 StringBuilder 多了一个 toStringCache 字段。toStringCache:在字符串 tostring 之后,保存执行 tostring() 方法之后的结果,当字符串改变的时候 toStringCache 就失效。
🎈拓展:单线程下的 StringBuilder
相比于 StringBuilder,StringBuffer 在单线程的情况下也是加锁的,所以锁的添加与释放都需要耗费一定的时间。由于 Synchronized 锁的优化,其锁的状态有偏向锁,轻量级锁,重量级锁,单线程状态下一直是一个线程持有该锁,所以一直是偏向锁,这样的话锁的添加与释放就减少了一定的时间耗费。
🍚总结
以上就是关于 String,StringBuilder,StringBuffer 区别,希望有所帮助。
版权声明: 本文为 InfoQ 作者【知识浅谈】的原创文章。
原文链接:【http://xie.infoq.cn/article/9795158e38640aafe6e1ba12c】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论