Java 等于验证与indexOf验证?

Java 等于验证与indexOf验证?,java,performance,Java,Performance,在替换此字符串之前,我需要验证一个字符串是否包含char$ 我为这个提议做了两个实现 第一个实现总是执行replace(char oldChar,char newChar)和equals(Object anObject)作为验证 String getImportLine(Class<?> clazz) { String importLine = toSanitizedClassName(clazz.getName()); String importStaticLine

在替换此字符串之前,我需要验证一个字符串是否包含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.indexOf(“$”)==-1
  • importLine.replace(“$”,“.”)

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

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

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

例如:

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

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

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

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

例如:

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

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

从我所知道的字符串长度来看,它们具有相同的大O。但你真正想弄清楚的是,某件事情是需要5纳秒还是7纳秒。为什么这很重要?@Tobb我只想确认这两种实现在效率方面没有重大区别。我不明白为什么我的问题如此错误。当一个反对者给出一个理由时,这是好的……这取决于你对“重要”的定义。但由于您使用的是java,我认为您的系统对时间的要求并不像这两种方法在执行时间上有任何差别那样“重要”。顺便说一句,我也不理解否决票。@Tobb我理解您的观点,您是对的,时间上的差别很小,也不重要。我只是想知道实现的效率更高。从我所知道的,字符串的长度来看,它们有相同的大O。但你真正想弄清楚的是,某件事情是需要5纳秒还是7纳秒。为什么这很重要?@Tobb我只想确认这两种实现在效率方面没有重大区别。我不明白为什么我的问题如此错误。当一个反对者给出一个理由时,这是好的……这取决于你对“重要”的定义。但由于您使用的是java,我认为您的系统对时间的要求并不像这两种方法在执行时间上有任何差别那样“重要”。顺便说一句,我也不理解否决票。@Tobb我理解您的观点,您是对的,时间上的差别很小,也不重要。我只是想知道实施起来更有效。哇,谢谢。我去等待别人的回答,然后才把你的回答当作接受。我更新了问题的标题。哇,谢谢。我去等待别人的回答,然后才把你的回答当作接受。我更新了问题的标题。
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);
}