10

Java 1.4.2 的替换实现和 Apache 2.3 的实现有什么区别?是否有性能提升?

Java 1.4.2 替换

Apache 2.3 替换

4

6 回答 6

18

您链接到的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对象。

于 2011-08-10T14:01:52.640 回答
3
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 实现而产生的开销。

于 2012-11-13T19:53:35.207 回答
2

1.4.2 replaces 仅使用char参数进行操作,而 Apache 2.3 使用字符串。

于 2011-08-10T14:00:48.720 回答
1
  • String.replace(char, char)无法替换整个字符串
  • 您可以null使用StringUtils.replace(..).

String.replace(CharSequence s1, CharSequence s2)如果第一个字符串不为空,将执行相同的操作。否则会抛出一个NullPointerException

于 2011-08-10T14:04:40.190 回答
0

如果我没记错的话,Apache 的速度要快得多。推荐的。

于 2011-08-10T14:02:00.470 回答
0

要使用 用另一个字符串替换一个字符串字符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"});

这将用新提供的值替换信息的字符串值...

于 2017-04-28T05:46:11.073 回答