Java 1.4.2 的替换实现和 Apache 2.3 的实现有什么区别?是否有性能提升?
6 回答
您链接到的String.replace()
方法采用两个char
值,因此它只会用另一个替换字符(可能多次,'虽然)。
StringUtils.replace()
另一方面,该方法将String
值作为搜索字符串和替换,因此它可以替换更长的子字符串。
Java 中可比较的方法是replaceAll()
. replaceAll()
可能比该StringUtils
方法慢,因为它支持正则表达式,因此引入了首先编译搜索字符串并运行正则表达式搜索的开销。
请注意,Java 5 引入了String.replace(CharSequence, CharSequence)
which 做同样的事情StringUtils.replace(String,String)
(除了它抛出一个NullPointerException
如果它的任何参数是null
)。请注意,这CharSequence
是一个由 实现的接口String
,因此您可以在此处使用普通的旧String
对象。
public class Compare {
public static void main(String[] args) {
StringUtils.isAlphanumeric(""); // Overhead of static class initialization for StringUtils
String key = "0 abcdefghijklmno" + Character.toString('\n') + Character.toString('\r');
String key1 = replace1(key);
String key2 = replace2(key);
}
private static String replace1(String key) {
long start = System.nanoTime();
key = StringUtils.replaceChars(key, ' ', '_');
key = StringUtils.replaceChars(key, '\n', '_');
key = StringUtils.replaceChars(key, '\r', '_');
long end = System.nanoTime() - start;
System.out.println("Time taken : " + end);
return key;
}
public static String replace2(String word) {
long start = System.nanoTime();
char[] charArr = word.toCharArray();
int length = charArr.length;
for (int i = 0; i < length; i++) {
if (charArr[i] == ' ' || charArr[i] == '\n' || charArr[i] == '\r') {
charArr[i] = '_';
}
}
String temp = new String(charArr);
long end = System.nanoTime() - start;
System.out.println("Time taken : " + end);
return temp;
}
}
耗时:6400
耗时:5888
时间几乎一样!
我已经编辑了代码以删除replace2
不是因为 JDK 实现而产生的开销。
1.4.2 replaces 仅使用char
参数进行操作,而 Apache 2.3 使用字符串。
String.replace(char, char)
无法替换整个字符串- 您可以
null
使用StringUtils.replace(..)
.
String.replace(CharSequence s1, CharSequence s2)
如果第一个字符串不为空,将执行相同的操作。否则会抛出一个NullPointerException
如果我没记错的话,Apache 的速度要快得多。推荐的。
要使用 用另一个字符串替换一个字符串字符StringUtil.Replace
,我尝试了以下操作,从单个字符串替换多个字符串值对我来说效果很好。
String info = "[$FIRSTNAME$]_[$LASTNAME$]_[$EMAIL$]_[$ADDRESS$]";
String replacedString = StringUtil.replace(info, new String[] { "[$FIRSTNAME$]","[$LASTNAME$]","[$EMAIL$]","[$ADDRESS$]" }, new String[] { "XYZ", "ABC" ,"abc@abc.com" , "ABCD"});
这将用新提供的值替换信息的字符串值...