[英]Explicitly Setting Regular Expression to Variable advantages
因此,如果我要通過掃描程序對象,為什么第二個代碼塊被認為更有效? 是因為在第二種情況下它是不變的嗎?
while (scanner.hasNext( "-1*" ))
與
static final Pattern regexExample = Pattern.compile( "-1*" );
while (scanner.hasNext( regexExample ))
效率取決於您使用正則表達式的方式。 正則表達式被編譯為實際用於比較的格式。 將正則表達式作為String
的函數必須在每次調用時對其進行編譯。 帶有預編譯Pattern
的函數將直接使用它。 如果您只調用過一次正則表達式,則不會有太大的區別。 如果您反復調用它, Pattern
版本將節省編譯步驟,因此從某種意義上講它效率更高。
第二個塊效率更高,因為它一次創建了正則表達式對象,然后在每次通過while循環時重新使用編譯的表達式。 第一個示例在while循環的每次傳遞中創建一個新的正則表達式對象。
編譯正則表達式並將其傳遞給hasNext(Pattern pattern)
方法並不是真正有效,因為Scanner的hasNext(String pattern)
將使用String創建的已編譯Pattern
放入緩存中。
在您的方案中,Scanner hasNext(Pattern pattern)
比hasNext(String arg0)
效率更高。 內部Scanner類hasNext(String arg0)
將您的字符串轉換為模式,並將其放入緩存中,然后調用hasNext(Pattern pattern)
。
請參見Scanner.hasNext(String arg0)定義:
public boolean hasNext(String arg0) {
return this.hasNext((Pattern)this.patternCache.forName(arg0));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.