在替换这个字符串之前,我需要验证一个字符串是否包含 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
作为验证在性能方面是否存在差异?
最佳答案
您要问的是String.indexOf
和String.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/