26

假设 a Regular Expression,通过 JavaMatcher对象与大量字符串匹配:

String expression = ...; // The Regular Expression
Pattern pattern = Pattern.compile(expression);
String[] ALL_INPUT = ...; // The large number of strings to be matched

Matcher matcher; // Declare but not initialize a Matcher

for (String input:ALL_INPUT)
{
    matcher = pattern.matcher(input); // Create a new Matcher

    if (matcher.matches()) // Or whatever other matcher check
    {
         // Whatever processing
    }
}

用于 Matcher 的 Java SE 6 JavaDoc 中,可以通过该方法找到重用同一Matcher对象的选项reset(CharSequence),如源代码所示,该方法比Matcher每次都创建一个新对象要便宜一些,即,与上面不同,可以做:

String expression = ...; // The Regular Expression
Pattern pattern = Pattern.compile(expression);
String[] ALL_INPUT = ...; // The large number of strings to be matched

Matcher matcher = pattern.matcher(""); // Declare and initialize a matcher

for (String input:ALL_INPUT)
{
    matcher.reset(input); // Reuse the same matcher

    if (matcher.matches()) // Or whatever other matcher check
    {
         // Whatever processing
    }
}

应该使用reset(CharSequence)上面的模式,还是应该更喜欢Matcher每次都初始化一个新对象?

4

1 回答 1

35

无论如何重用Matcher. 创建新的唯一好理由Matcher是确保线程安全。这就是你不创建的public static Matcher m原因——事实上,这就是Pattern首先存在一个单独的、线程安全的工厂对象的原因。

在您确定在任何时间点只有一个用户的每种情况下,都Matcher可以将其与reset.

于 2012-07-09T09:21:26.933 回答