比较两个字符串的前三个字符

nal*_*alo 9 java

字符串s1和s2的长度始终为1或更高.

我怎样才能加快速度呢?

int l1 = s1.length();

if (l1 > 3) { l1 = 3; }

if (s2.startsWith(s1.substring(0,l1))) 
{
 // do something..
}
Run Code Online (Sandbox Code Playgroud)

正则表达式可能吗?

lui*_*bal 6

这似乎很合理.这对你来说真的太慢了​​吗?你确定这不是过早的优化吗?

  • 我认为你应该在一种方法中将其隔离,如果它后来看起来太慢,你可以优化它.同时,确保这确实是程序中的慢速部分(例如,您可能应该更关注IO速度?) (7认同)

Dig*_*oss 6

重写以避免对象创建

你的直觉是正确的.新对象(substring())的创建速度不是很快,这意味着每个创建的对象也必须产生g/c开销.

这可能会快得多:

static boolean fastCmp(String s1, String s2) {
    return s1.regionMatches(0, s2, 0, 3);
}
Run Code Online (Sandbox Code Playgroud)


Boz*_*zho 3

if (s2.startsWith(s1.substring(0, Math.min(3, s1.length())) {..};
Run Code Online (Sandbox Code Playgroud)

顺便说一句,没有什么慢的。startsWith有复杂性O(n)

另一种选择是比较 char 值,这可能更有效:

boolean match = true;
for (int i = 0; i < Math.min(Math.min(s1.length(), 3), s2.length()); i++) {
    if (s1.charAt(i) != s2.charAt(i)) {
       match = false;
       break;
    }
}
Run Code Online (Sandbox Code Playgroud)