等于验证与indexOf验证?

Jes*_*rce 0 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);
}
Run Code Online (Sandbox Code Playgroud)

此实现解析字符串两次:

  • 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);
}   
Run Code Online (Sandbox Code Playgroud)

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

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

使用equalsvs indexOf作为验证之间在性能方面是否存在一些差异?

Tob*_*obb 6

你问的是String.indexOf和之间执行时间的差异String.equals.使用Big-O表示法时它们是相同的,因为两个(最坏情况)将String在返回之前迭代整个.

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

例如:

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

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