在替换此字符串之前,我需要验证一个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('$', '.')
使用equals
与indexOf
作为验证之间在性能方面是否存在差异?
答案 0 :(得分:6)
您要问的是String.indexOf
和String.equals
之间执行时间的差异。使用Big-O表示法时,它们是相同的,因为两个(最坏情况)将在返回之前遍历整个String
。
在实践中,它实际上取决于输入。
例如:
equals
将立即返回equals
)快于"abcdef".equals("aXcdef"
,"abcdef".equals("abcdeX")
将会更快返回indexOf('$')
早期出现在字符串中,则{li> $
会更快("a$cdef".indexOf('$')
快于"abcde$".indexOf('$')
)
如果输入字符是特殊字符,indexOf
会慢一些
在现代计算机上,这应该无关紧要,因为它们如此之快以至于任何差异都是不可察觉的,除非该方法被调用了数十万次(或者使用非常大的输入字符串)。优化代码时,应注重节省秒数,而不是纳秒。对于您当前的问题,您应该更加担心让您的代码可读并且可以被其他人理解,而不是担心使用最多CPU周期的代码。