等于验证与indexOf验证?

时间:2016-02-24 10:36:42

标签: java performance

在替换此字符串之前,我需要验证一个String是否包含char $

我为这个提议做了两个实现。

第一个实现始终执行replace(char oldChar, char newChar)equals(Object anObject)作为验证。

String getImportLine(Class<?> clazz) {
    String importLine = toSanitizedClassName(clazz.getName());
    String importStaticLine = importLine.replace('$', '.');
    if (importLine.equals(importStaticLine)) {
        return String.format("import %s;", importLine);
     } 
    return String.format("import static %s;", importStaticLine);
}

此实现使用以下命令解析字符串两次:

  • importLine.replace('$', '.')
  • importLine.equals(importStaticLine)

第二种实现方法使用indexOf(int ch)作为验证,并在最坏的情况下使用replace(char oldChar, char newChar)

String getImportLine(Class<?> clazz) {
    String importLine = toSanitizedClassName(clazz.getName());
    if (importLine.indexOf('$') == -1) {
        return String.format("import %s;", importLine);
    }
    importLine = importLine.replace('$', '.');
    return String.format("import static %s;", importLine);
}   

第二种实现,在最坏的情况下,用以下代码解析字符串两次:

  • importLine.indexOf('$') == -1
  • importLine.replace('$', '.')

使用equalsindexOf作为验证之间在性能方面是否存在差异?

1 个答案:

答案 0 :(得分:6)

您要问的是String.indexOfString.equals之间执行时间的差异。使用Big-O表示法时,它们是相同的,因为两个(最坏情况)将在返回之前遍历整个String

在实践中,它实际上取决于输入。

例如:

    如果比较的两个字符串是不同的长度,
  • equals将立即返回
  • 如果字符串中的差异早期发生(equals)快于"abcdef".equals("aXcdef"
  • "abcdef".equals("abcdeX")将会更快返回
  • 如果indexOf('$')早期出现在字符串中,则{li> $会更快("a$cdef".indexOf('$')快于"abcde$".indexOf('$')) 如果输入字符是特殊字符,
  • indexOf会慢一些

在现代计算机上,这应该无关紧要,因为它们如此之快以至于任何差异都是不可察觉的,除非该方法被调用了数十万次(或者使用非常大的输入字符串)。优化代码时,应注重节省秒数,而不是纳秒。对于您当前的问题,您应该更加担心让您的代码可读并且可以被其他人理解,而不是担心使用最多CPU周期的代码。