I know of two ways of repla开发者_JS百科cing all occurrences of substring in a string.
The regex way (assuming "substring-to-be-replaced" doesn't include regex special chars):
String regex = "substring-to-be-replaced" + "+";
Pattern scriptPattern = Pattern.compile(regex);
Matcher matcher = scriptPattern.matcher(originalstring);
newstring = matcher.replaceAll("replacement-substring");
The String.replace() way:
newstring = originalstring.replace("substring-to-be-replaced", "replacement-substring");
Which of the two is more efficient (and why)?
Are there more efficient ways than the above described two?
String.replace()
uses regex underneath.
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL)
.matcher(this ).replaceAll(
Matcher.quoteReplacement(replacement.toString()));
}
Are there more efficient ways than the above described two?
There are given that you operate on an implementation backed e.g., by an array, rather than the immutable String class (since string.replace
creates a new string on each invocation). See for instance StringBuilder.replace().
Compiling a regex incurs quite alot of overhead which is clear when observing the Pattern source code. Luckily, Apache offers an alternative approach in StringUtils.replace()
which according to the source code (line #3732) is quite efficient.
Here's the source code from openjdk:
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
Not having done any profiling or benchmarking, I'd say it's a fairly safe bet that if you don't need regex magic, then the overhead of the regular expression parser (which you'll get no matter what, in terms of memory as well as CPU usage) costs you a lot more than you can possibly gain on the other end.
Instead of using string
s, which are immutable, use char
arrays or some other mutable type (such as StringBuffer
or StringBuilder
).
Shouldn't you compare replaceAll 2 times? However, for a single invocation it will hardly be measurable. And will you do millions of comparisions?
Then I would expect 'compile' to be faster, but only, if you don't use a constant String without any pattern-rules.
Where is the problem in writing a micro benchmark? Or look up the source.
精彩评论