如果需要关注性能,则为Java中的字符串模式匹配的最佳方法

| 问候, 假设您要测试一个字符串,以查看它是否完全匹配,或者是否与_匹配,并在_之后附加任意数量的字符 有效的匹配示例:
MyTestString
MyTestString_
MyTestString_1234
如果性能是一个很大的问题,您将调查哪些方法?目前,我正在执行以下操作:
if (String.equals(stringToMatch)) {
            // success
        } else {
            if (stringToMatch.contains(stringToMatch + \"_\")) {
                // success
            }
            // fail
        }
我尝试用_ *上的Java.util.regex.Pattern匹配替换String.contains _模式,但效果却差得多。我的解决方案在这里是理想的还是您可以考虑使用更多的切割刀来提高性能呢? 感谢您的任何想法     
已邀请:
        你可以做类似的事情
if(string.startsWith(testString)) {
    int len = testString.length();
    if(string.length() == len || string.charAt(len) == \'_\')
          // success
}
我假设即使您有\“ _ \”,您也希望testString出现吗? 编辑:在使用一个长条件还是嵌套if语句上,代码或性能没有差异。
public static void nestedIf(boolean a, boolean b) {
    if (a) {
        if (b) {
            System.out.println(\"a && b\");
        }
    }
}

public static void logicalConditionIf(boolean a, boolean b) {
    if (a && b) {
        System.out.println(\"a && b\");
    }
}
编译为相同的代码。如果你做
javap -c
public static void nestedIf(boolean, boolean);
  Code:
   0:   iload_0
   1:   ifeq    16
   4:   iload_1
   5:   ifeq    16
   8:   getstatic       #7; //Field java/lang/System.out:Ljava/io/PrintStream;
   11:  ldc     #8; //String a && b
   13:  invokevirtual   #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   16:  return

public static void logicalConditionIf(boolean, boolean);
  Code:
   0:   iload_0
   1:   ifeq    16
   4:   iload_1
   5:   ifeq    16
   8:   getstatic       #7; //Field java/lang/System.out:Ljava/io/PrintStream;
   11:  ldc     #8; //String a && b
   13:  invokevirtual   #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   16:  return
编译的代码是相同的。     
        您可以使用正则表达式来匹配模式。您可以使用
stringToMatch.matches(\".*?_.*?\")
。这将返回一个布尔值。     
        我运行了一些基准测试。这是我能得到的最快的。
    String a = \"Test123\";
    String b = \"Test123_321tseT_Test_rest\";
    int len1 = a.length();
    int len2 = b.length();
    if ((len1 == len2 || (len2 > len1 && (b.charAt(len1)) == \'_\'))
        && b.startsWith(a)) {
        System.out.println(\"success\");
    } else {
        System.out.println(\"Fail\");
    }
这至少将在合理的性能下正常工作。 编辑:我切换了_检查和startsWith检查,因为startsWith将有较差的_检查。 Edit2:修复了StringIndexOutOfBoundsException。 Edit3:Peter Lawrey是正确的,仅对a.length()进行一次调用会节省时间。就我而言为2.2%。 最新的基准测试显示,我的速度比OP快88%,比Peter Lawrey的代码快10%。 Edit4:我用一个本地var替换了所有的str.length(),并运行了更多的基准测试。现在基准测试的结果变得如此随机,无法说出什么代码更快。我的最新版本似乎胜出一筹。     

要回复问题请先登录注册