String、StringBuilder、StringBuffer 的本质区别
作为 Java 开发者String、StringBuilder、StringBuffer 这三个类几乎每天都在用。但面试官总爱问这道题因为它背后藏着 JVM 内存模型、线程安全、性能优化等核心知识点。今天我们从本质出发彻底把这三个类讲透。一、String 为什么不可变看一下 JDK 源码String 类被 final 修饰不能被继承底层字符数组 value 也是 final 的一旦赋值就不能改变引用。所以当你写下String s hello;s s world;你以为是在修改 s实际上是创建了一个新的 String 对象 hello world然后让 s 指向这个新对象。原来的 hello 对象还在堆里等待 GC 回收。这就是为什么在循环里用 String 拼接字符串会有性能问题每次拼接都在创建新对象内存抖动严重。经典面试题字符串常量池String a hello;String b hello;String c new String(hello);a b 结果是 true常量池复用a c 结果是 falsenew 在堆上创建新对象a.equals(c) 结果是 true。字面量赋值时JVM 会先检查常量池里有没有这个字符串有就直接复用。二、StringBuilder高性能的可变字符序列StringBuilder 是 JDK 1.5 引入的专门解决 String 频繁拼接的性能问题。底层也是 char 数组但这个数组是可变的。低效写法String result ;for (int i 0; i小于10000; i) result i;高效写法StringBuilder sb new StringBuilder();for (int i 0; i小于10000; i) sb.append(i);性能差距可能达到 500 倍以上因为 String 每次 都创建新对象而 StringBuilder 在原数组上扩容追加。扩容机制StringBuilder 默认容量 16超出时扩容为原容量 x 2 2。如果你提前知道字符串的大概长度可以在构造时指定初始容量new StringBuilder(1024)减少扩容次数。三、StringBuffer线程安全版StringBuffer 比 StringBuilder 早出现API 几乎一模一样最大的区别是所有方法都加了 synchronized 关键字保证多线程安全但也带来了性能开销。什么时候用 StringBuffer只有多线程共享同一个字符串构建器时才需要。如果 StringBuilder 只是方法内的局部变量每个线程都有自己的栈帧不存在共享用 StringBuilder 完全没问题。四、三者核心对比String不可变、线程安全、频繁修改时性能差、适合字符串不变或少量拼接StringBuilder可变、非线程安全、性能最好、适合单线程频繁拼接StringBuffer可变、线程安全、性能略差、适合多线程共享拼接五、编译器优化的坑很多人以为 String 拼接一定慢其实不完全对。Java 编译器会对常量拼接做优化String s hello world; 在编译期就变成了 hello world。但在循环里就不一样了每次循环都会 new 一个 StringBuilder所以循环拼接一定要手动用 StringBuilder。总结String 的不可变性是核心设计带来了线程安全和常量池复用的好处代价是频繁修改时的性能损耗。StringBuilder 和 StringBuffer 都是为了解决这个问题而生区别只在于是否需要线程安全。实际开发中 99% 的场景用 StringBuilder 就够了。end往期精彩文章复习回顾1.SpringBoot 插件化开发模式真香啊 2.一行代码实现请假审批流程Java版 3.血泪教训8 个线程池最佳实践和坑 4.是时候优化了告别繁琐操作实现一次登录产品互通 5.太失败了工作5年后我才知道 Java 泛型的上限和下限~最近整理一份资料《程序员学习手册》覆盖了 Java技术、面试题精选、操作系统基础知识、计算机基础知识、Linux教程、计算机网络等等。获取方式点“在看关注公众号Java大数据修炼之道并回复PDF领取更多内容陆续奉上。长按识别下方二维码关注后回复关键字:PDF领取你想学的java知识这里都有,长按下方图片识别关注我们吧~如喜欢本文请点击右上角把文章分享到朋友圈 因公众号更改推送规则请点“在看”并加“星标”第一时间获取精彩技术分享 点分享点收藏点在看
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2455414.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!