1簡介
判別一個字符串是否包括某個特定子串是常見的場景,比方判別一篇文章是否包括靈敏詞匯、判別日志是否有ERROR信息等。本文將介紹四種辦法并進行功用測驗。
2四種辦法
2.1JDK原生辦法String.indexOf
在String的函數(shù)中,供給了indexOf(subStr)辦法,回來子串subStr第一次呈現(xiàn)的位置,如果不存在則回來-1。比如如下:
//包括JavaassertEquals(7,”PkslowJava”.indexOf(“Java”));//如果包括多個,回來第一次呈現(xiàn)位置assertEquals(0,”JavaJava”.indexOf(“Java”));//大小寫靈敏assertEquals(-1,”GoogleGuava”.indexOf(“guava”));
2.2JDK原生辦法String.contains
最直觀判別的辦法是contains(subStr),回來類型為boolean,如果包括回來true,不包括則回來false。比如如下:
//包括JavaassertTrue(“codeinJava”.contains(“Java”));//大小寫靈敏,不包括GOassertFalse(“Let’sgo”.contains(“GO”));//轉(zhuǎn)為大寫后包括assertTrue(“Let’sgo”.toUpperCase().contains(“GO”));
實踐上,String的contains辦法是經(jīng)過調(diào)用indexOf辦法來判別的,源碼如下:
publicbooleancontains(CharSequences){returnindexOf(s.toString())>-1;
}
2.3JDK原生正則匹配Pattern
經(jīng)過強壯的正則匹配來判別,雖然有點殺雞用牛刀的感覺,但也不是不能用,比如如下:
Patternpattern=Pattern.compile(“Java”);//包括JavaMatchermatcher1=pattern.matcher(“Python,Java,Go,C++”);
assertTrue(matcher1.find());//不包括JavaMatchermatcher2=pattern.matcher(“Python,C,Go,Matlab”);
assertFalse(matcher2.find());
2.4Apache庫StringUtils.contains
Apache的commons-lang3供給許多開箱即用的功用,StringUtils就供給了許多與字符串相關(guān)的功用,比如如下:
//包括subassertTrue(StringUtils.contains(“StringsubString”,”sub”));//大小寫靈敏assertFalse(StringUtils.contains(“ThisisJava”,”java”));//疏忽大小寫assertTrue(StringUtils.containsIgnoreCase(“ThisisJava”,”java”));
3功用比照
咱們運用JMH工具來對四種辦法進行功用測驗,Maven引進代碼如下:
<dependency><groupId>org.openjdk.jmhgroupId><artifactId>jmh-coreartifactId><version>${openjdk.jmh.version}version>dependency><dependency><groupId>org.openjdk.jmhgroupId><artifactId>jmh-generator-annprocessartifactId><version>${openjdk.jmh.version}version>dependency>
測驗代碼如下:
@BenchmarkMode(Mode.AverageTime)@OutputTimeUnit(TimeUnit.NANOSECONDS)publicclassStringContainsPerformanceTest{@State(Scope.Thread)publicstaticclassMyState{privateStringtext=”Ifyouwanttobesmart;read.Ifyouwanttobereallysmart;readalot.”;
Patternpattern=Pattern.compile(“read”);
}@BenchmarkpublicintindexOf(MyStatestate){returnstate.text.indexOf(“read”);
}@Benchmarkpublicbooleancontains(MyStatestate){returnstate.text.contains(“read”);
}@BenchmarkpublicbooleanstringUtils(MyStatestate){returnStringUtils.contains(state.text,”read”);
}@Benchmarkpublicbooleanpattern(MyStatestate){returnstate.pattern.matcher(state.text).find();
}publicstaticvoidmain(String[]args)throwsException{
Optionsoptions=newOptionsBuilder()
.include(StringContainsPerformanceTest.class.getSimpleName())
.threads(6)
.forks(1)
.warmupIterations(3)
.measurementIterations(6)
.shouldFailOnError(true)
.shouldDoGC(true)
.build();newRunner(options).run();
}
}
測驗結(jié)果如下:
BenchmarkModeCntScoreErrorUnitscontainsavgt611.331±1.435ns/op
indexOfavgt611.250±1.822ns/op
patternavgt6101.196±12.047ns/op
stringUtilsavgt629.046±3.873ns/op
最快的便是indexOf辦法,其次是contains辦法,二者應(yīng)該沒有實踐區(qū)別,contains是調(diào)用indexOf來完成的。Apache的StringUtils為第三方庫,相對慢一些。最慢的是運用了正則的Pattern的辦法,這不難理解,正則引擎的匹配是比較耗功用的。
4總結(jié)
本文介紹了判別一個字符串是否包括某個特定子串的四種辦法,并經(jīng)過功用測驗進行了比照。其間功用最好的是String的indexOf辦法和contains辦法,主張運用contains辦法,功用好,跟indexOf比較,更直觀,更不簡單犯錯。畢竟讓每個人時刻記住回來-1代表不存在也不是一件簡單的事。
但是,運用indexOf和contains辦法都需求注意做判空處理,這時StringUtils的優(yōu)勢就體現(xiàn)出來了。
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長沙市天心區(qū)芙蓉中路三段398號新時空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運營網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號