舉個簡單了例子,在一個需要用于注冊登錄的b/s模式的應用中,在瀏覽器驗證用戶注冊表單的合法性是必須的,但你為了防止hacker,在服務器再驗證一次肯定也是必須的。
題目:在服務器端驗證郵箱是否合法:通常你可能會這樣寫:
public boolean checkEmailLegal(String temp)
{
//temp = "ddenfj#@fe_dw.comw";
return temp.matches("^([\\.a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\\.[a-zA-Z0-9_-]{2,3}){1,2})$");
}
當然這樣寫可以滿足你的需求,但是,今天要和大家分享我使用Pattern提高效率的使用心得,首先,先看一下我對小面代碼進行的簡單的測試:
import java.util.regex.Pattern;
public class SimpleTest {
public static void main(String[] args)
{
String temp = "ddenfj#@fe_dw.comw";
int count = 1;
long a = System.currentTimeMillis();
for(int i=0;i
{
temp.matches("^([\\.a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\\.[a-zA-Z0-9_-]{2,3}){1,2})$");
}
long b = System.currentTimeMillis();
System.out.println(b-a);
a = System.currentTimeMillis();
Pattern emailPattern = Pattern.compile("^([\\.a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\\.[a-zA-Z0-9_-]{2,3}){1,2})$");
for(int i=0;i
{
emailPattern.matcher(temp).matches();
}
b = System.currentTimeMillis();
System.out.println(b-a);
}
}運行次數為 1 時,運行結果:
4
0
運行次數為 100 時,運行結果:
16
1
運行次數為1000時,運行結果:
111
8
運行次數為10000時,運行結果:
343
11
運行次數為100000時,運行結果:
841
65
運行次數為一千萬時,運行結果:
8205
94
我們知道,匹配正則表達式首先創建有窮自動機
我的結論:從測試記過可以看出String.matches()方法的時間并不是想想中的線性增長的,可以得出的結論是jvm一定對String.matches()方法進行了緩存的處理,也就是說調用這個方法產生的一切中間對象并未被jvm清理,如果運用到你的應用上,可能效率體現得會很明顯
----------------------------------------------------------------------------------------------------------
寫完以上內容,還在我洋洋自得的時候,我想看一下String.matches()的源代碼:
public boolean matches(String regex) {
return Pattern.matches(regex, this);
}
public static boolean matches(String regex, CharSequence input) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
return m.matches();
}
看來我對jvm的上方理解是錯誤的,
不過從他們的源碼我們可以看出來,如果把Pattern寫成一個靜態(static)屬性,并用spring管理對象,那效率還是會提高很多的!
望共勉!