免费爱碰视频在线观看,九九精品国产屋,欧美亚洲尤物久久精品,1024在线观看视频亚洲

      「Java必修課」判斷String是否包含子串的四種方法及性能對比

      1 簡介

      判斷一個字符串是否包含某個特定子串是常見的場景,比如判斷一篇文章是否包含敏感詞匯、判斷日志是否有ERROR信息等。本文將介紹四種方法并進(jìn)行性能測試。

      2 四種方法

      2.1 JDK原生方法String.indexOf

      在String的函數(shù)中,提供了indexOf(subStr)方法,返回子串subStr第一次出現(xiàn)的位置,如果不存在則返回-1。例子如下:

      //包含JavaassertEquals(7, “Pkslow Java”.indexOf(“Java”));//如果包含多個,返回第一次出現(xiàn)位置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”));//轉(zhuǎn)為大寫后包含assertTrue(“Let’s go”.toUpperCase().contains(“GO”));

      實際上,String的contains方法是通過調(diào)用indexOf方法來判斷的,源碼如下:

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

      2.3 JDK原生正則匹配Pattern

      通過強(qiáng)大的正則匹配來判斷,雖然有點殺雞用牛刀的感覺,但也不是不能用,例子如下:

      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就提供了許多與字符串相關(guān)的功能,例子如下:

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

      3 性能對比

      我們使用JMH工具來對四種方法進(jìn)行性能測試,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(); }}

      測試結(jié)果如下:

      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方法,二者應(yīng)該沒有實際區(qū)別,contains是調(diào)用indexOf來實現(xiàn)的。Apache的StringUtils為第三方庫,相對慢一些。最慢的是使用了正則的Pattern的方法,這不難理解,正則引擎的匹配是比較耗性能的。

      4 總結(jié)

      本文介紹了判斷一個字符串是否包含某個特定子串的四種方法,并通過性能測試進(jìn)行了對比。其中性能最好的是String的indexOf方法和contains方法,建議使用contains方法,性能好,跟indexOf相比,更直觀,更不容易犯錯。畢竟讓每個人時刻記住返回-1代表不存在也不是一件容易的事。

      但是,使用indexOf和contains方法都需要注意做判空處理,這時StringUtils的優(yōu)勢就體現(xiàn)出來了。

      如果本文對你有幫助,別忘記給我個3連 ,點贊,轉(zhuǎn)發(fā),評論,,咱們下期見。

      收藏 等于白嫖,點贊才是真情。

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

      鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
      用戶投稿
      上一篇 2022年7月3日 15:19
      下一篇 2022年7月3日 15:19

      相關(guān)推薦

      • 分享4條發(fā)微商朋友圈的方法(微商朋友圈應(yīng)該怎么發(fā))

        對于微商朋友來說,朋友圈的重要性不言而喻了。 那么微商的朋友圈到底該怎么發(fā)呢? 為什么同樣是經(jīng)營一個朋友圈,有的微商看起來逼格滿滿,實際效果也不錯;而有的卻動都不動就被屏蔽甚至拉黑…

        2022年11月27日
      • 網(wǎng)通復(fù)古(網(wǎng)通復(fù)古傳奇)

        本文主要講的是網(wǎng)通復(fù)古,以及和網(wǎng)通復(fù)古傳奇相關(guān)的知識,如果覺得本文對您有所幫助,不要忘了將本文分享給朋友。 推薦個網(wǎng)通傳奇私服 要中變的 我是網(wǎng)通 要個網(wǎng)通的 不卡的 老傳奇?zhèn)鹘y(tǒng)戰(zhàn)…

        2022年11月27日
      • 《寶可夢朱紫》夢特性怎么獲得?隱藏特性獲取方法推薦

        寶可夢朱紫里有很多寶可夢都是擁有夢特性會變強(qiáng)的寶可夢,很多玩家不知道夢特性怎么獲得,下面就給大家?guī)韺毧蓧糁熳想[藏特性獲取方法推薦,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 …

        2022年11月25日
      • 《寶可夢朱紫》奇魯莉安怎么進(jìn)化?奇魯莉安進(jìn)化方法分享

        寶可夢朱紫中的奇魯莉安要怎么進(jìn)化呢?很多玩家都不知道,下面就給大家?guī)韺毧蓧糁熳掀骠斃虬策M(jìn)化方法分享,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 奇魯莉安進(jìn)化方法分享 奇魯莉安…

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

        光遇11月25日的紅石出現(xiàn)在霞谷圓夢村,許多小伙伴都還不知道它具體在哪,下面就讓小編來給大家介紹一下光遇11.25紅石的位置,感興趣的小伙伴快來看看吧。 光遇11.25紅石位置 1…

        2022年11月25日
      • 《光遇》11月25日季節(jié)蠟燭在哪 11.25季節(jié)蠟燭位置2022

        光遇季節(jié)蠟燭的位置每天都會變化,今天出現(xiàn)在了雨林地區(qū),下面小編就給大家?guī)砹斯庥?1.25季節(jié)蠟燭位置分享,有需要的小伙伴不要錯過哦。 光遇11.25季節(jié)蠟燭位置2022 今日季節(jié)…

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

        CPA渠道 CPA指的是按照指定的行為結(jié)算,可以是搜索,可以是注冊,可以是激活,可以是搜索下載激活,可以是綁卡,實名認(rèn)證,可以是付費(fèi),可以是瀏覽等等。甲乙雙方可以根據(jù)自己的情況來定…

        2022年11月25日
      • OPPO Reno9 Pro+硬件規(guī)格強(qiáng) 搭載驍龍8+旗艦處理器

        OPPO Reno9系列正式發(fā)布,Reno9 Pro+作為三款新機(jī)中定位最高的超大杯機(jī)型,整體配置較上一代有著大幅度的升級,如果單看硬件配置的話,Reno9 Pro+甚至是目前OP…

        2022年11月24日
      • 《寶可夢朱紫》樁子是什么?二級神封印樁位置一覽

        寶可夢朱紫中有一種叫做二級神封印樁的特殊收集道具,很多玩家不知道寶可夢朱紫樁子是什么,下面就帶來寶可夢朱紫二級神封印樁位置一覽,感興趣的小伙伴不要錯過,希望能幫助到大家。 二級神封…

        2022年11月24日
      • 《寶可夢朱紫》太晶水地龍捕捉位置一覽 太晶水地龍在哪里捕捉

        近日在貼吧看到有許多玩家在寶可夢朱紫中遇到了《寶可夢朱紫》太晶水地龍捕捉位置一覽的問題,又不知道該怎么辦。今天在這里,小編為大家?guī)淼木褪沁@個問題的解方案,只要你跟著小編的節(jié)奏來,…

        2022年11月24日

      聯(lián)系我們

      聯(lián)系郵箱:admin#wlmqw.com
      工作時間:周一至周五,10:30-18:30,節(jié)假日休息