明确地将正则表达式设置为可变优势

时间:2017-02-28 21:13:46

标签: java regex

因此,如果我要浏览扫描程序对象,为什么第二块代码被认为更有效?是因为它在第二种情况下是不可变的吗?

while (scanner.hasNext( "-1*" )) 

对战

static final Pattern regexExample = Pattern.compile( "-1*" );  
while (scanner.hasNext( regexExample ))

4 个答案:

答案 0 :(得分:3)

效率取决于你如何使用正则表达式。正则表达式被编译成实际用于比较的格式。将正则表达式作为String的函数必须在每次调用时编译它。采用预编译Pattern的函数只是直接使用它。如果你只打电话给一次正则表达式,它并没有太大的区别。如果你反复调用它,Pattern版本会保存编译步骤,所以从这个意义上说它更有效。

答案 1 :(得分:0)

第二个块更有效率,因为它创建一次正则表达式对象,然后在每次遍历while循环时重用已编译的表达式。第一个示例在每次遍历while循环时创建一个新的正则表达式对象。

答案 2 :(得分:0)

编译正则表达式并将其传递给hasNext(Pattern pattern)方法效率并不高,因为扫描程序的hasNext(String pattern)将使用字符串创建的已编译Pattern放入缓存中。

答案 3 :(得分:0)

在您的方案中,扫描程序hasNext(Pattern pattern)hasNext(String arg0)更有效。 内部扫描程序类hasNext(String arg0)将您的字符串转换为模式并将其放入缓存中,然后调用hasNext(Pattern pattern)

请参阅Scanner.hasNext(String arg0)定义:

 public boolean hasNext(String arg0) {
  return this.hasNext((Pattern)this.patternCache.forName(arg0));
}