色欲av一区久久精品_久久综合色综合色88_无码在线观看不卡_色黄视频网站_亚洲国产精品久久久久秋霞66

判斷String是否包括子串的四種方法及功能比照

時間:2023-05-16

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)出來了。

文章標簽:

Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號

與項目經(jīng)理交流
掃描二維碼
與項目經(jīng)理交流
掃描二維碼
與項目經(jīng)理交流
ciya68