「Java必修课」判断String是否包含子串的四种方法及性能对比

1 简介

判断一个字符串是否包含某个特定子串是常见的场景,比如判断一篇文章是否包含敏感词汇、判断日志是否有ERROR信息等。本文将介绍四种方法并进行性能测试。

2 四种方法

2.1 JDK原生方法String.indexOf

在String的函数中,提供了indexOf(subStr)方法,返回子串subStr第一次出现的位置,如果不存在则返回-1。例子如下:

//包含JavaassertEquals(7, “Pkslow Java”.indexOf(“Java”));//如果包含多个,返回第一次出现位置assertEquals(0, “Java Java”.indexOf(“Java”));//大小写敏感assertEquals(-1, “Google Guava”.indexOf(“guava”));

2.2 JDK原生方法String.contains

最直观判断的方法是contains(subStr),返回类型为boolean,如果包含返回true,不包含则返回false。例子如下:

//包含JavaassertTrue(“code in Java”.contains(“Java”));//大小写敏感,不包含GOassertFalse(“Let’s go”.contains(“GO”));//转为大写后包含assertTrue(“Let’s go”.toUpperCase().contains(“GO”));

实际上,String的contains方法是通过调用indexOf方法来判断的,源码如下:

public boolean contains(CharSequence s) { return indexOf(s.toString()) > -1;}

2.3 JDK原生正则匹配Pattern

通过强大的正则匹配来判断,虽然有点杀鸡用牛刀的感觉,但也不是不能用,例子如下:

Pattern pattern = Pattern.compile(“Java”);//包含JavaMatcher matcher1 = pattern.matcher(“Python, Java, Go, C++”);assertTrue(matcher1.find());//不包含JavaMatcher matcher2 = pattern.matcher(“Python, C, Go, Matlab”);assertFalse(matcher2.find());

2.4 Apache库StringUtils.contains

Apache的commons-lang3提供许多开箱即用的功能,StringUtils就提供了许多与字符串相关的功能,例子如下:

//包含subassertTrue(StringUtils.contains(“String subString”, “sub”));//大小写敏感assertFalse(StringUtils.contains(“This is Java”, “java”));//忽略大小写assertTrue(StringUtils.containsIgnoreCase(“This is Java”, “java”));

3 性能对比

我们使用JMH工具来对四种方法进行性能测试,Maven引入代码如下:

org.openjdk.jmh jmh-core ${openjdk.jmh.version} org.openjdk.jmh jmh-generator-annprocess ${openjdk.jmh.version}

测试代码如下:

@BenchmarkMode(Mode.AverageTime)@OutputTimeUnit(TimeUnit.NANOSECONDS)public class StringContainsPerformanceTest { @State(Scope.Thread) public static class MyState { private String text = “If you want to be smart; read. If you want to be really smart; read a lot.”; Pattern pattern = Pattern.compile(“read”); } @Benchmark public int indexOf(MyState state) { return state.text.indexOf(“read”); } @Benchmark public boolean contains(MyState state) { return state.text.contains(“read”); } @Benchmark public boolean stringUtils(MyState state) { return StringUtils.contains(state.text, “read”); } @Benchmark public boolean pattern(MyState state) { return state.pattern.matcher(state.text).find(); } public static void main(String[] args) throws Exception { Options options = new OptionsBuilder() .include(StringContainsPerformanceTest.class.getSimpleName()) .threads(6) .forks(1) .warmupIterations(3) .measurementIterations(6) .shouldFailOnError(true) .shouldDoGC(true) .build(); new Runner(options).run(); }}

测试结果如下:

Benchmark Mode Cnt Score Error Unitscontains avgt 6 11.331 1.435 ns/opindexOf avgt 6 11.250 1.822 ns/oppattern avgt 6 101.196 12.047 ns/opstringUtils avgt 6 29.046 3.873 ns/op

最快的就是indexOf方法,其次是contains方法,二者应该没有实际区别,contains是调用indexOf来实现的。Apache的StringUtils为第三方库,相对慢一些。最慢的是使用了正则的Pattern的方法,这不难理解,正则引擎的匹配是比较耗性能的。

4 总结

本文介绍了判断一个字符串是否包含某个特定子串的四种方法,并通过性能测试进行了对比。其中性能最好的是String的indexOf方法和contains方法,建议使用contains方法,性能好,跟indexOf相比,更直观,更不容易犯错。毕竟让每个人时刻记住返回-1代表不存在也不是一件容易的事。

但是,使用indexOf和contains方法都需要注意做判空处理,这时StringUtils的优势就体现出来了。

如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,,咱们下期见。

收藏 等于白嫖,点赞才是真情。

原文 https://www.cnblogs.com/larrydpk/p/12459386.html

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
用户投稿
上一篇 2022年7月3日 15:19
下一篇 2022年7月3日 15:19

相关推荐

  • 分享4条发微商朋友圈的方法(微商朋友圈应该怎么发)

    对于微商朋友来说,朋友圈的重要性不言而喻了。 那么微商的朋友圈到底该怎么发呢? 为什么同样是经营一个朋友圈,有的微商看起来逼格满满,实际效果也不错;而有的却动都不动就被屏蔽甚至拉黑…

    2022年11月27日
  • 网通复古(网通复古传奇)

    本文主要讲的是网通复古,以及和网通复古传奇相关的知识,如果觉得本文对您有所帮助,不要忘了将本文分享给朋友。 推荐个网通传奇私服 要中变的 我是网通 要个网通的 不卡的 老传奇传统战…

    2022年11月27日
  • 《宝可梦朱紫》梦特性怎么获得?隐藏特性获取方法推荐

    宝可梦朱紫里有很多宝可梦都是拥有梦特性会变强的宝可梦,很多玩家不知道梦特性怎么获得,下面就给大家带来宝可梦朱紫隐藏特性获取方法推荐,感兴趣的小伙伴一起来看看吧,希望能帮助到大家。 …

    2022年11月25日
  • 《宝可梦朱紫》奇鲁莉安怎么进化?奇鲁莉安进化方法分享

    宝可梦朱紫中的奇鲁莉安要怎么进化呢?很多玩家都不知道,下面就给大家带来宝可梦朱紫奇鲁莉安进化方法分享,感兴趣的小伙伴一起来看看吧,希望能帮助到大家。 奇鲁莉安进化方法分享 奇鲁莉安…

    2022年11月25日
  • 《光遇》11月25日红石在哪里 11.25红石位置

    光遇11月25日的红石出现在霞谷圆梦村,许多小伙伴都还不知道它具体在哪,下面就让小编来给大家介绍一下光遇11.25红石的位置,感兴趣的小伙伴快来看看吧。 光遇11.25红石位置 1…

    2022年11月25日
  • 《光遇》11月25日季节蜡烛在哪 11.25季节蜡烛位置2022

    光遇季节蜡烛的位置每天都会变化,今天出现在了雨林地区,下面小编就给大家带来了光遇11.25季节蜡烛位置分享,有需要的小伙伴不要错过哦。 光遇11.25季节蜡烛位置2022 今日季节…

    2022年11月25日
  • 什么是推广cpa一篇文章带你看懂CPA推广渠道

    CPA渠道 CPA指的是按照指定的行为结算,可以是搜索,可以是注册,可以是激活,可以是搜索下载激活,可以是绑卡,实名认证,可以是付费,可以是浏览等等。甲乙双方可以根据自己的情况来定…

    2022年11月25日
  • OPPO Reno9 Pro+硬件规格强 搭载骁龙8+旗舰处理器

    OPPO Reno9系列正式发布,Reno9 Pro+作为三款新机中定位最高的超大杯机型,整体配置较上一代有着大幅度的升级,如果单看硬件配置的话,Reno9 Pro+甚至是目前OP…

    2022年11月24日
  • 《宝可梦朱紫》桩子是什么?二级神封印桩位置一览

    宝可梦朱紫中有一种叫做二级神封印桩的特殊收集道具,很多玩家不知道宝可梦朱紫桩子是什么,下面就带来宝可梦朱紫二级神封印桩位置一览,感兴趣的小伙伴不要错过,希望能帮助到大家。 二级神封…

    2022年11月24日
  • 《宝可梦朱紫》太晶水地龙捕捉位置一览 太晶水地龙在哪里捕捉

    近日在贴吧看到有许多玩家在宝可梦朱紫中遇到了《宝可梦朱紫》太晶水地龙捕捉位置一览的问题,又不知道该怎么办。今天在这里,小编为大家带来的就是这个问题的解方案,只要你跟着小编的节奏来,…

    2022年11月24日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息