『Java 语法基础』String、StringBuffer 与 StringBuilder 的区别

第一点: 可变和适用范围。String 对象是不可变的,而 StringBuffer 和 StringBuilder 是可变字符序列。每次对 String 的操作相当于生成一个新的 String 对象,而对 StringBuffer 和 StringBuilder 的操作是对对象本身的操作,而不会生成新的对象,所以对于频繁改变内容的字符串避免使用 String,因为频繁的生成对象将会对系统性能产生影响。

String、StringBuffer 和 StringBuilder 这三者在处理字符串时各有不同。String 类型是 Java 中的基本数据类型之一,它代表不可变的字符序列。这意味着一旦一个 String 对象被创建,那么它所包含的字符序列就不能被更改了。

举个例子,如果你想在一个字符串后面加上另外一些文字,如果你是用 String 来处理,每次添加操作实际上都会在内存中创建一个新的 String 对象来保存新的字符序列,旧的 String 对象则可能被垃圾回收机制回收(如果没有其它引用指向它)。这个过程是隐形的,你看不到,但是它确实在发生,尤其是当有很多字符串操作的时候,这会造成内存的浪费和额外的性能开销。

相对于 String,StringBuffer 和 StringBuilder 是可变的字符序列。这意味着你可以直接在原有对象的基础上添加新内容或者更改内容,而不需要每次都创建一个新的对象。这使得它们在处理需要频繁修改内容的字符串时更加高效。

那么,它们两个有什么区别呢?

StringBuffer 是线程安全的,也就是说当多个线程同时试图修改同一个 StringBuffer 对象时,它可以保证数据的正确性和一致性。而 StringBuilder 则没有这种线程安全的保证,但是在单线程环境下,它的性能要优于 StringBuffer,因为它避免了线程安全带来的性能开销。

用一个简单的比喻来理解这三者的区别: 如果把字符串比作一束花束,那么一个 String 就像是用一次性花瓶装饰的花束。每当你想换一束花,你就需要一个新的花瓶。而 StringBuffer 和 StringBuilder 就像是可以重复使用的花瓶。你可以随时往里面添加新的花朵(字符),或者拿掉一些花朵,而不需要每次都换一个新的花瓶。如果你家里只有你一个人(单线程),那么用 StringBuilder 就足够了,如果你家里同时有很多人可能同时去改变这束花(多线程),那么你可能就需要一个有更好锁机制的花瓶,也就是 StringBuffer。

在实际开发中,如果一个字符串不会被多个线程同时修改,那么推荐使用 StringBuilder,因为它通常会给你带来更好的性能;如果字符串安全性是个问题,那么你可能需要使用 StringBuffer。而当确定字符串的内容在创建后不会再发生变化时,你可以使用 String。

第二点: 线程安全。String 由于有 final 修饰,是 immutable 的,安全性是简单而纯粹的。StringBuilder 和 StringBuffer 的区别在于 StringBuilder 不保证同步,也就是说如果需要线程安全需要使用 StringBuffer,不需要同步的 StringBuilder 效率更高。

想象一下你在一家餐厅里做厨师,而字符串就像是你正在准备的一道菜。

String 像是一家只接受外卖订单的餐厅,顾客点了什么菜,你就准备什么,整个过程非常简单和直接。一旦菜做好并打包好,就不能再改了——如果顾客想加点什么调料或者改变一下,你需要重新准备一份新的菜。这种方式非常安全,因为每个订单都是独立处理,不会相互影响。

StringBuffer 就像一家忙碌的餐厅,有很多服务员和厨师同时工作。在这种环境下,你需要确保不会有两个人同时去盛一样的菜导致混乱。为此,餐厅里有一个规则,就是在一个人准备某道菜的时候,其他人必须等他完成才能开始他们的工作。这就相当于线程安全,StringBuffer 就是这样工作的,它有一套内建的机制来保证即使多个线程尝试修改同一个字符串,每个修改还是会被逐个顺序地处理,不会造成混乱。

StringBuilder 在这个比喻中,就像是只有一个厨师在厨房里工作。由于同一时间只有他一个人在那里,所以不需要担心会有其他人跟他抢着去做同一件事。这就意味着他可以更加高效地工作,不需要等待也不需要遵守轮流的规则。在程序中,如果你知道只有一个线程会修改字符串,那么使用 StringBuilder 就足够了,因为它不带线程安全的额外开销,因此可以更快地完成任务。

简而言之,在需要考虑数据在多个线程之间共享并且可能同时被修改的情况下,为了保证数据的一致性和完整性,你就需要像 StringBuffer 这样的线程安全的选项。如果没有这种需要,那么 StringBuilder 就是一个更快速的选择。而 String 始终是不可变的,适合那些一旦创建就不需要修改的场景。

posted @   BNTang  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
  1. 1 总会有人离开 王巨星
  2. 2 月亮 孟凡明
  3. 3 迟里乌布
  4. 4 我只能离开 颜人中
  5. 5 达尔文 蔡健雅
  6. 6 夜色滚烫 叶明净
  7. 7 你的星环 路飞文
  8. 8 不再说话 三块木头
  9. 9 黄昏 粥粥和小伙/粥粥
  10. 10 爱不单行 刘大拿
  11. 11 心动贩卖机 PIggy
  12. 12 别来无恙 苏星婕
  13. 13 我们的歌 刘大拿
  14. 14 一直很安静 王贰浪
  15. 15 去有风的地方 清音
  16. 16 雪 Distance Capper/罗言
  17. 17 坏女孩 徐良/小凌
  18. 18 乐园 沧桑Cang333/虎皮蛋/曲甲
  19. 19 Ayo(Explicit) Chris Brown/Tyga
  20. 20 我的美丽feat.海洋Bo 海洋Bo/高睿
  21. 21 世事可爱 粥粥和小伙/粥粥
  22. 22 我记得 赵雷
  23. 23 我想牵着你的手 许嵩
  24. 24 人们都不懂 刘诺然
  25. 25 寻一个你(电视剧《苍兰诀》温情主题曲) TTTTTeehom
  26. 26 子莫格尼 杉和
  27. 27 Cat Cafe Shoffy
  28. 28 风停了雨停了我们还拥抱着 Superluckyqi
  29. 29 寂寞沙洲冷 于潼
  30. 30 三国恋 王巨星
  31. 31 达尔文 林俊杰
  32. 32 有些 颜人中
  33. 33 小模样 张小只ya
  34. 34 是否 程响
  35. 35 楼顶上的小斑鸠 队长
  36. 36 笑场 薛之谦
  37. 37 还是分开 张叶蕾
  38. 38 修炼爱情 林俊杰
  39. 39 二零三 毛不易
  40. 40 雅俗共赏 许嵩
  41. 41 Serendipity 古瑞斯Graps/Zakiya晴子
  42. 42 就让这大雨全都落下·2023 刘大拿
  43. 43 老男孩 筷子兄弟
  44. 44 有何不可 许嵩
  45. 45 缓缓 杜宣达
  46. 46 好久不见 陈奕迅
  47. 47 爱的魔法(Cover 金莎) 封茗囧菌
  48. 48 在你的身边 盛哲
  49. 49 带我去找夜生活 告五人
  50. 50 假面舞会 很美味
  51. 51 STAY The Kid LAROI/Justin Bieber
  52. 52 我好想睡觉的 无敌西红柿
  53. 53 日不落(温柔版)
  54. 54 恋爱画板 锦零
  55. 55 7710 好乐无荒/尹露浠
  56. 56 给你呀(又名:for ya) 蒋小呢
  57. 57 Love Story Taylor Swift
  58. 58 Plain Jane(Remix 13z) 鱼幼微
  59. 59 晚风 7opy/BT07
  60. 60 拜托 孙晨
  61. 61 乌梅子酱 李荣浩
  62. 62 南半球与北海道 范倪Liu
  63. 63 星河万里 Rom邢锐
缓缓 - 杜宣达
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

Loading

点击右上角即可分享
微信分享提示