近期笔者分析一段在线代码的性能时,发现Java String类中split()方法的性能和网上一些帖子的描述并不相同,是以记录澄清。
Java String split方法到底有没有使用正则表达式?
结论:
分隔符符合两种情况:(1) 单字符字符串,而且这个字符不是
正则表达式的元字符“$|()[{^?*+\\”。(2)两个字符字符串,第一个字符是反斜杠和第二个不是ascii数字或ascii字母。那么执行split方法不会使用正则表达式。其他情况下会使用正则表达式。
因此,显见地说,如果想要提高性能,分隔符的选择极其重要。最好使用单字符非正则表达式元字符,如英文逗号等。
StringUtils.split(string,char)效率是不是比JDK原生的高?
结论:
不一定,关键还是看分隔符的选择。
使用英文逗号“,”作为分隔符的情况:
使用英文"|"作为分隔符的情况:请注意箭头所指的耗时,比上一次测试用时更短,这是因为这次的分隔符在原字符串中不存在。
当使用数字1作为分隔符时,两种方法用时接近,而且随着原字符中和分隔符命中率增高,StringUtils的split方法用时明显在增加。
最后总结:
1.jdk原生split方法性能很大程度上取决于分隔符的选择,如英文逗号,单个数字,单个字母,英文分号,英文冒号都能带来很好的性能表现。
2.StringUtils的split的确在一些情况下,如分隔符在源字符串中不存在,分隔符属于正则表达式元字符等情况下,使用StringUtils的split会有更好的性能表现。
3.但是,随着命中率增高StringUtils的split的性能曲线开始衰减,而jdk原生split方法则有比较稳定的表现。