我有两种可能性,制作正则表达式或进行if比较。
如果比较
if (!(modoImpressao.equals("IMPRESSORA") ||
modoImpressao.equals("PDF") || modoImpressao.equals("AMBOS")))
正则表达式匹配
if (!Pattern.compile("(IMPRESSORA)|(PDF)|(AMBOS)",Pattern.DOTALL).matcher(modoImpressao).find()){
throw new EspdNeverStopParametroInvalidoException(TspdConstMessages.IMPRIMIR_PARAMETRO_MODOIMPRESSAO_INVALIDO,"TspdImprimirNFCe");
}
哪一个更快?
答案 0 :(得分:12)
第一个片段几乎肯定会更快,因为它不需要解析正则表达式并对其执行匹配。另一种选择是:
if (Arrays.asList("IMPRESSORA", "PDF", "AMBOS").contains(modoImpressao)
与第一段代码的速度差别不大,但可以说更具可读性和简洁性。
正则表达式很棒,但只在需要时使用它们。这种情况绝对不能保证使用正则表达式;你正在做的就是与文字字符串进行比较。
Jamie Zawinski有一句古老的说法是这样的:
有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。
答案 1 :(得分:2)
如果您只使用正则表达式一次,则可能会更慢,尤其是当您在问题中使用find
时实际意味着matches
时。
当您保留已编译的Pattern
并多次使用它时,它有可能比多个等于更快。
然而,这取决于具体情况。如果您正在测试的所有String
都是文字并且匹配更有可能失败,那么String.equals
会更快,因为如果实例是相同的,它将在电路上进行测试。
最快的解决方案是根据候选String
的易于检查的属性进行预选,该属性对于所有String
是不同的,例如char
位于特定位置或length
,并为所选equals
执行一次String
。在你的情况下,第一个字符和长度都是合适的。在这种情况下,我更喜欢长度,因为在访问角色之前必须检查长度以防止空Strings
:
使用length
的首选变体:
nomatch:
{
switch(modoImpressao.length())
{
case 3: if(modoImpressao.equals("PDF")) break nomatch; break;
case 5: if(modoImpressao.equals("AMBOS")) break nomatch; break;
case 10: if(modoImpressao.equals("IMPRESSORA")) break nomatch; break;
}
throw new EspdNeverStopParametroInvalidoException(
TspdConstMessages.IMPRIMIR_PARAMETRO_MODOIMPRESSAO_INVALIDO,
"TspdImprimirNFCe");
}
// one of the three values matched
使用第一个char
的变体:
nomatch:
{
if(modoImpressao.length()>0) switch(modoImpressao.charAt(0))
{
case 'P': if(modoImpressao.equals("PDF")) break nomatch; break;
case 'A': if(modoImpressao.equals("AMBOS")) break nomatch; break;
case 'I': if(modoImpressao.equals("IMPRESSORA")) break nomatch; break;
}
throw new EspdNeverStopParametroInvalidoException(TspdConstMessages.IMPRIMIR_PARAMETRO_MODOIMPRESSAO_INVALIDO,"TspdImprimirNFCe");
}
// one of the three values matched