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

1简介

判别一个字符串是否包括某个特定子串是常见的场景,比方判别一篇文章是否包括灵敏词汇、判别日志是否有ERROR信息等。本文将介绍四种办法并进行功用测验。
2四种办法
2.1JDK原生办法String.indexOf
在String的函数中,供给了indexOf(subStr)办法,回来子串subStr第一次呈现的位置,如果不存在则回来-1。比如如下:
//包括JavaassertEquals(7,”PkslowJava”.indexOf(“Java”));//如果包括多个,回来第一次呈现位置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”));//转为大写后包括assertTrue(“Let’sgo”.toUpperCase().contains(“GO”));
实践上,String的contains办法是经过调用indexOf办法来判别的,源码如下:
publicbooleancontains(CharSequences){returnindexOf(s.toString())>-1;
}
2.3JDK原生正则匹配Pattern
经过强壮的正则匹配来判别,虽然有点杀鸡用牛刀的感觉,但也不是不能用,比如如下:
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就供给了许多与字符串相关的功用,比如如下:
//包括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();
}
}
测验结果如下:
BenchmarkModeCntScoreErrorUnitscontainsavgt611.3311.435ns/op
indexOfavgt611.2501.822ns/op
patternavgt6101.19612.047ns/op
stringUtilsavgt629.0463.873ns/op
最快的便是indexOf办法,其次是contains办法,二者应该没有实践区别,contains是调用indexOf来完成的。Apache的StringUtils为第三方库,相对慢一些。最慢的是运用了正则的Pattern的办法,这不难理解,正则引擎的匹配是比较耗功用的。
4总结
本文介绍了判别一个字符串是否包括某个特定子串的四种办法,并经过功用测验进行了比照。其间功用最好的是String的indexOf办法和contains办法,主张运用contains办法,功用好,跟indexOf比较,更直观,更不简单犯错。毕竟让每个人时刻记住回来-1代表不存在也不是一件简单的事。
但是,运用indexOf和contains办法都需求注意做判空处理,这时StringUtils的优势就体现出来了。

© 版权声明
好牛新坐标
版权声明:
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com

相关文章