Какая разница между реализацией Java 1.4.2 и заменой Apache 2.3? Есть ли усиление производительности друг над другом?
Apache StringUtils против реализации Java replace()
Ответ 1
Метод String.replace()
, с которым вы связаны, принимает два значения char
, поэтому он только заменяет символ другим (возможно, несколько раз, хотя).
Метод StringUtils.replace()
с другой стороны принимает значения String
в качестве строки поиска и замены, поэтому он может заменить более длинные подстроки.
Сопоставимый метод в Java будет replaceAll()
. replaceAll()
, вероятно, будет медленнее, чем метод StringUtils
, поскольку он поддерживает регулярные выражения и, таким образом, вводит накладные расходы на компиляцию первой строки поиска и запуск поиска в регулярном выражении.
Обратите внимание, что Java 5 ввела String.replace(CharSequence, CharSequence)
, который делает то же самое, что и StringUtils.replace(String,String)
(кроме того, что он выбрасывает NullPointerException
, если он его аргументов null
). Обратите внимание, что CharSequence
- это интерфейс, реализованный с помощью String
, поэтому вы можете использовать простые старые String
объекты здесь.
Ответ 2
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.
Ответ 3
1.4.2 заменяет только аргументы char
, тогда как Apache 2.3 принимает строки.
Ответ 4
-
String.replace(char, char)
не может заменить целые строки - вы можете иметь
null
значения сStringUtils.replace(..)
.
String.replace(CharSequence s1, CharSequence s2)
будет делать то же самое, если первая строка не равна-null. В противном случае он выкинет NullPointerException
Ответ 5
Apache довольно быстро, если я правильно помню. Рекомендуется.
Ответ 6
Чтобы заменить строковый символ на другую строку с помощью StringUtil.Replace
, я попробовал следовать, и он отлично работает для меня, чтобы заменить несколько строковых значений из одной строки.
String info = "[$FIRSTNAME$]_[$LASTNAME$]_[$EMAIL$]_[$ADDRESS$]";
String replacedString = StringUtil.replace(info, new String[] { "[$FIRSTNAME$]","[$LASTNAME$]","[$EMAIL$]","[$ADDRESS$]" }, new String[] { "XYZ", "ABC" ,"[email protected]" , "ABCD"});
Это заменит значение String информации новым значением...