本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
前言
- 在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进行数据操作会造成不必要的对象存在。
- 诺,你看我们将ni+hao ,最终得到nihao , 此时内存中就有三份。ni、hao只能站着内存等待GC 。 占用内存不说可能回引起不必要的GC 。 活该被经理骂
改良
- 经过百度一波之后发现
StringBuilder
被大家推荐使用。原因就是他不会产生额外内存。这样就完美避免了我是用String
带来的问题 - 解决问题美滋滋。又可以愉快的玩耍了。但是我们不能仅仅追求与问题的解决。既然我们选择了新的类我们就要尽量了解
StringBuilder
这个类
- 通过他的类结构图我们得出如下结论
- 实现了
Serializable
接口保证序列化问题 - 实现了
CharSequence
接口保证了对char的统一访问 - 继承了
AbstractStringBuilder
将拥有对String
的抽象操作。这里是为了扩展功能才将功能抽象。比如说还有线程安全的StringBuffer
- 实现了
总结
- 有些问题不是我们的代码有问题,而是我们没有恰当的使用它。在合适的地方使用合适的api才能发挥出功效
多谢客官点赞