假设Regular Expression
,它通过Java Matcher
对象与大量字符串匹配:
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
}
}
在Java SE 6 JavaDoc for Matcher中,可以通过Matcher
方法找到重用相同reset(CharSequence)
对象的选项,正如源代码所示,该方法比创建方法便宜一点每次都有一个新的Matcher
,也就是说,与上面不同,可以做到:{/ p>
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
对象?
答案 0 :(得分:25)
一定要重用Matcher
。创建新Matcher
的唯一好理由是确保线程安全。这就是你没有制作public static Matcher m
的原因 - 实际上,这就是首先存在一个单独的,线程安全的Pattern
工厂对象的原因。
在您确定任何时间点只有Matcher
的{{1}}用户的情况下,可以将其与reset
重复使用。