Java String split方法性能分析

	近期笔者分析一段在线代码的性能时,发现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方法则有比较稳定的表现。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在处理大量数据时,Java的`split()`方法可能会导致性能下降。如果需要更快速的拆分方法,可以考虑使用`StringTokenizer`类或者使用基于正则表达式的`Pattern`和`Matcher`类。 下面是一个使用`StringTokenizer`进行拆分的示例代码: ```java import java.util.StringTokenizer; public class SplitExample { public static void main(String[] args) { String input = "This is a sample string to split"; String delimiter = " "; StringTokenizer tokenizer = new StringTokenizer(input, delimiter); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); System.out.println(token); } } } ``` 在上述代码中,我们使用`StringTokenizer`类将字符串按照指定的分隔符(这里使用空格)进行拆分。通过`hasMoreTokens()`和`nextToken()`方法,我们可以逐个获取拆分后的单词。 另一种更灵活的方法是使用基于正则表达式的`Pattern`和`Matcher`类。下面是一个示例代码: ```java import java.util.regex.Matcher; import java.util.regex.Pattern; public class SplitExample { public static void main(String[] args) { String input = "This is a sample string to split"; String regex = "\\s+"; // 使用空格作为分隔符 Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); String[] tokens = pattern.split(input); for (String token : tokens) { System.out.println(token); } } } ``` 在上述代码中,我们使用正则表达式`\\s+`来匹配一个或多个连续的空格作为分隔符。使用`Pattern`的`split()`方法可以将字符串按照指定的正则表达式进行拆分,返回拆分后的字符串数组。 请注意,如果拆分的字符串中包含多个连续的分隔符,这两种方法的行为可能稍有不同。您可以根据具体的需求选择适合的方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值