logo头像

学如逆水行舟,不进则退!!!

文章目录

String会造成OOM。那么StringBuilder呢

本文于365天之前发表,文中内容可能已经过时。

前言

  • 在Java操作中使用最广泛的可以说是String 类了。在String类中java为了我们提供了简便创建对象方法。直接赋值法
  • 但是String有个问题是final修饰的。还记得刚入门那会疯狂的使用String 因此吃了不少苦

代码审查

  • 关于String的问题并没有在线上吃过亏,因为他太常见了这种问题造成的bug在未成形就会被技术经理扼杀在摇篮中
  • 记得一次代码审查中我当时的技术经理审查了我的代码当时是忐忑不安啊。最终也是难逃一劫
  • 审查结果就是在特定的场景,我大量使用了String来接收字符串并进行字符串处理。经理给的结果是可能造成内存不必要的使用更有甚者会OOM

优化代码

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
  • 点开源码看一看就能知道了。赫然显示的final字样。string是不可修改的。如果频繁使用string进行数据操作会造成不必要的对象存在。

image-20210513161704626

  • 诺,你看我们将ni+hao ,最终得到nihao , 此时内存中就有三份。ni、hao只能站着内存等待GC 。 占用内存不说可能回引起不必要的GC 。 活该被经理骂

改良

  • 经过百度一波之后发现StringBuilder被大家推荐使用。原因就是他不会产生额外内存。这样就完美避免了我是用String带来的问题
  • 解决问题美滋滋。又可以愉快的玩耍了。但是我们不能仅仅追求与问题的解决。既然我们选择了新的类我们就要尽量了解StringBuilder这个类

image-20210514090042811

  • 通过他的类结构图我们得出如下结论
    • 实现了Serializable接口保证序列化问题
    • 实现了CharSequence接口保证了对char的统一访问
    • 继承了AbstractStringBuilder将拥有对String的抽象操作。这里是为了扩展功能才将功能抽象。比如说还有线程安全的StringBuffer

总结

  • 有些问题不是我们的代码有问题,而是我们没有恰当的使用它。在合适的地方使用合适的api才能发挥出功效

多谢客官点赞

上一篇
坚持原创技术分享,您的支持将鼓励我继续创作!

评论系统未开启,无法评论!