簡體   English   中英

顯式設置正則表達式以發揮可變的優勢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM