1.概述方法String.trim ()删除末尾和开头的空格。 但是,不支持仅运行L-Trim或R-Trim。
在本教程中,我们将看到一些实现这个目标的方法。 最后,比较它们的性能。
2.while循环最简单的解决方案是使用几个while循环遍历字符串。
对于L-Trim,从左到右读取字符串,直到遇到非空白字符。
int i=0; while(Is.Length ) ) Character.iswhitespace ) s.Charat(I ) ) I; }stringltrim=s.substring(I; ltrim是以第一个非空白字符开始的子字符串。
对于R-Trim,从右到左读取字符串,直到遇到非空白字符。
int i=s.length ()-1; while (I=0character.is white space ) s.charat(I ) ) I----; }stringrtrim=s.substring(0,i 1 ); rim是从第一个非空白字符的开头到结尾的子字符串。
3.String.replaceAll使用正则表达式另一个选择是使用String.replaceAll ()和正则表达式。
string ltrim=src.replace all (' ^s ',' ); string rtrim=src.replace all ('s $ ',' ); () s )是与一个或多个空格匹配的正则表达式。 正则表达式的开头和结尾插入记号(^ )和) $ )与行的开头和结尾匹配。
也可以使用33558 www.Sina.com/Java.util.regex.pattern重用正则表达式。
privatestaticpatternltrim=pattern.com pile (^s ); privatestaticpatternrtrim=pattern.com pile ('s $ ' ); stringltrim=ltrim.Matcher(s ).replaceAll (' ); StringRtim=Rtrim.Matcher(s ).replaceAll (' );4.Pattern.compile()和.matcher()也可以使用apachecommonsstringutils # stripstart和#stripEnd方法删除空格。
为此,我们首先增加了公地lang3依赖性:
ependencygroupidorg.Apache.com mons/groupidartifactidcommons-lang3/artifactidversion 3.11/version/dependency是一个文档
string ltrim=string utils.stripstart (src,null ); string rtrim=string utils.stripend (src,null );5. Apache CommonsGuava最后,使用guavacharmatcher # trimleadingfrom和#trimTrailingFrom方法获得相同的结果。
让我们再次添加适当的Maven依赖关系。 这次是guava :
ependencygroupidcom.Google.guava/groupidartifactidguava/artifactidversion 28.2-j
re</version> </dependency>在Guava中,它与Apache Commons中的实现方法非常相似,只是使用了更具针对性的方法:
String ltrim = CharMatcher.whitespace().trimLeadingFrom(s); String rtrim = CharMatcher.whitespace().trimTrailingFrom(s); 7.性能比较让我们看看这些方法的性能。像往常一样,我们将使用开源框架Java Microbenchmark Harness(JMH)来比较不同的替代方案(以纳秒为单位)。
7.1。基准设定对于基准测试的初始配置,我们使用了五个分叉和平均时间计算时间(以纳秒为单位):
@Fork(5)@State(Scope.Benchmark)@BenchmarkMode(Mode.AverageTime)@OutputTimeUnit(TimeUnit.NANOSECONDS)在设置方法中,我们正在初始化原始消息字段和生成的字符串以与以下内容进行比较:
@Setuppublic void setup() { src = " White spaces left and right "; ltrimResult = "White spaces left and right "; rtrimResult = " White spaces left and right";}所有基准测试首先删除sqdqj,然后删除右空格,最后将结果与预期字符串进行比较。
7.2。while循环对于我们的第一个基准测试,让我们使用while循环方法:
@Benchmarkpublic boolean whileCharacters() { String ltrim = whileLtrim(src); String rtrim = whileRtrim(src); return checkStrings(ltrim, rtrim);} 7.3。具有正则表达式的String.replaceAll()然后,让我们尝试String.replaceAll():
@Benchmarkpublic boolean replaceAllRegularExpression() { String ltrim = src.replaceAll("^\s+", ""); String rtrim = src.replaceAll("\s+$", ""); return checkStrings(ltrim, rtrim);} 7.4。Pattern.compile()。matches()之后是Pattern.compile()。matches():
@Benchmarkpublic boolean patternMatchesLTtrimRTrim() { String ltrim = patternLtrim(src); String rtrim = patternRtrim(src); return checkStrings(ltrim, rtrim);} 7.5。阿帕奇共享区第四,Apache Commons:
@Benchmarkpublic boolean apacheCommonsStringUtils() { String ltrim = StringUtils.stripStart(src, " "); String rtrim = StringUtils.stripEnd(src, " "); return checkStrings(ltrim, rtrim);} 7.6。番石榴最后,让我们使用番石榴:
@Benchmarkpublic boolean guavaCharMatcher() { String ltrim = CharMatcher.whitespace().trimLeadingFrom(src); String rtrim = CharMatcher.whitespace().trimTrailingFrom(src); return checkStrings(ltrim, rtrim);} 7.7。结果分析我们应该得到一些类似于以下内容的结果:
# Run complete. Total time: 00:16:57Benchmark Mode Cnt Score Error UnitsLTrimRTrim.apacheCommonsStringUtils avgt 100 108,718 ± 4,503 ns/opLTrimRTrim.guavaCharMatcher avgt 100 113,601 ± 5,563 ns/opLTrimRTrim.patternMatchesLTtrimRTrim avgt 100 850,085 ± 17,578 ns/opLTrimRTrim.replaceAllRegularExpression avgt 100 1046,660 ± 7,151 ns/opLTrimRTrim.whileCharacters avgt 100 110,379 ± 1,032 ns/op看来我们的赢家是while循环,Apache Commons和Guava!
8.结论在本教程中,我们研究了在String的开头和结尾处删除空格字符的几种不同方法。
我们使用while循环,String.replaceAll(), Pattern.matcher()。replaceAll(), Apache Commons和Guava来获得此结果。
与往常一样,该代码可在GitHub上获得。