前言:
最近在学习Java性能调优,看到相关字符串优化的文章,阅读之后有一些思考,认为还是比较重要的,这里在这记录下
1、字符串拼接
简单的字符串拼接,如 “a" +"b",这种虚拟机会自行使用Stringbuilder 来进行优化,但在循环中,还是需要显示的声明,因为目前在循环里边,虚拟机是重复构建 Stringbuilder 的
提一点,与Stringbuilder 相对的是StringBuffer 这线程安全的字符串拼接器,但就目前来说 StringBuffer 基本就没见过真正使用的用途,使用这玩意仅仅是保证jvm不抛出异常顺利的往下执行而已,它可不保证逻辑正确和调用顺序正确。而真正需要线程安全还是需要锁来进行处理,都用锁了还用这玩意干啥呢?
2、合理使用 intern 方法
合理使用 intern(),在每次赋值的时候使用 String 的 intern 方法,如果常量池中有相同值,就会重复使用该对象,返回对象引用,这样一开始的对象就可以被回收掉。这种情况适用于存在大量重复字符串。
这部分涉及到了Java 的内存区域了,目前在1.7之后字符串常量池已经归到堆里边了。总而言之,intern 方法就是返回在字符串常量池中字符串的引用。来张图吧,如图1所示:
3、合理使用正则表达式
正则表达式的性能是非常不稳定的,使用不恰当会引起回溯问题,很可能导致 CPU 居高不下。而在String.split方法里边,就使用了正则表达式(字符串长度大于1),这边推荐使用 String.indexof,如果不满足需要,还是可以用的,但需要关注是否会产生回溯这问题。