Подтвердить что ты не робот

Apache StringUtils против реализации Java replace()

Какая разница между реализацией Java 1.4.2 и заменой Apache 2.3? Есть ли усиление производительности друг над другом?

Java 1.4.2 заменить

Apache 2.3 заменить

4b9b3361

Ответ 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 информации новым значением...