志在指尖
用双手敲打未来

判断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.331±1.435ns/op
indexOfavgt611.250±1.822ns/op
patternavgt6101.196±12.047ns/op
stringUtilsavgt629.046±3.873ns/op
最快的便是indexOf办法,其次是contains办法,二者应该没有实践区别,contains是调用indexOf来完成的。Apache的StringUtils为第三方库,相对慢一些。最慢的是运用了正则的Pattern的办法,这不难理解,正则引擎的匹配是比较耗功用的。
4总结
本文介绍了判别一个字符串是否包括某个特定子串的四种办法,并经过功用测验进行了比照。其间功用最好的是String的indexOf办法和contains办法,主张运用contains办法,功用好,跟indexOf比较,更直观,更不简单犯错。毕竟让每个人时刻记住回来-1代表不存在也不是一件简单的事。
但是,运用indexOf和contains办法都需求注意做判空处理,这时StringUtils的优势就体现出来了。

未经允许不得转载:IT技术网站 » 判断String是否包括子串的四种方法及功能比照
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载