java - 等于验证与indexOf验证?

标签 java performance

在替换这个字符串之前,我需要验证一个字符串是否包含 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 作为验证在性能方面是否存在差异?

最佳答案

您要问的是String.indexOfString.equals之间的执行时间差异。对于 Big-O 表示法,它们是相同的,因为两者(最坏的情况)都会在返回之前迭代整个 String

实际上,这实际上取决于输入。

例如:

  • equals 如果比较的两个字符串长度不同,则几乎立即返回
  • 如果字符串中的差异较早出现,
  • equals 将更快返回("abcdef".equals("aXcdef") 比 "abcdef"更快。等于(“abcdeX”))
  • 如果 $ 出现在字符串的前面,
  • indexOf('$') 会更快 ("a$cdef".indexOf('$')"abcde$".indexOf('$'))
  • 更快
  • indexOf 如果输入字符是特殊字符,会变慢

在现代计算机上,这应该不重要,因为它们的速度非常快,任何差异都不会被注意到,除非该方法被调用数十万次(或使用非常大的输入字符串)。优化代码时,应该注重节省秒数,而不是纳秒。对于您当前的问题,您应该更担心如何让您的代码对其他人可读和理解,而不是担心哪个使用最多的 CPU 周期。

关于java - 等于验证与indexOf验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35599703/

相关文章:

performance - 垃圾回收会影响性能吗?

r - 使用 R 通过循环将数据读取和写入文件的有效方法

java - JScrollPane 无法在 JPanel 中工作

java - 在 SAX 解析期间确定根元素

java - 没有状态的对象在发布时总是可见吗?

c++ - 删除 vector 行时如何更快?

java - 实现 UUID 以获得更好的性能

performance - numpy数组子维度上的python操作

JAVA_HOME 未指向 JDK

Java - 如何将由空格分隔的整数读入数组