因此,如果我要浏览扫描程序对象,为什么第二块代码被认为更有效?是因为它在第二种情况下是不可变的吗?
while (scanner.hasNext( "-1*" ))
对战
static final Pattern regexExample = Pattern.compile( "-1*" );
while (scanner.hasNext( regexExample ))
答案 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));
}