今天檢視了string.split的實現方式,對於其中的實現原理與弊端進行乙個更好的認識.
1.split的引數是乙個regex,正規表示式.
要說到正規表示式,那就避免不了特殊字元的轉義,比如+號,|號等都需要繼續轉義的.
2.效能優劣
正規表示式是需要complie的,那麼就會有時間上的消耗.
而string.split這個方法的呼叫如下:
public string split(string regex, int limit)
呼叫的是pattern.compile(regex)返回的pattern物件的split方法.
而pattern.complie(regex)方法是直接new pattern(regex,0);
private pattern(string p, int f) else
}在深入看一下compile()方法,
其中最後一句如下:
compiled = true;
這個是乙個:
/*** boolean indicating this pattern is compiled; this is necessary in order
* to lazily compile deserialized patterns.
*/private transient volatile boolean compiled = false;
非靜態的變數.
再來看看split方法:
其中有去獲取matcher物件的步驟:
matcher m = matcher(input);
public matcher matcher(charsequence input)
}matcher m = new matcher(this, input);
return m;
}如果compile()沒有進行的話,就進行乙個compile()步驟.
問題就在整理了,使用string.split(regex)方法是直接new 乙個pattern例項,每次都會進行一次compile(),消耗就在這裡了...
所以說,如果可以的話,最後是定義好乙個pattern供所有的地方呼叫....
再來說一下pattern的split(regex,limit)的方法.
這裡面有limit引數,限制了匹配的次數.如果是0的話,便是總是去匹配,如果大於0,進行有效匹配.
使用例子來:
string s = "a,b,c:e,f,g";
string split = s.split(",");
system.out.println(arrays.tostring(split));
string split3 = s.split(",", 1);//得到長度為0
system.out.println(split3.length);
system.out.println(arrays.tostring(split3));
string split4 = s.split(",", 3);//得到長度為3
system.out.println(split4.length);
system.out.println(arrays.tostring(split4));
結果:[a, b, c:e, f, g]
1[a,b,c:e,f,g]
3[a, b, c:e,f,g]
String split 對空字元的處理
開發時做字串分割為陣列時遇到這樣的問題,分割符後是空串,沒有作為元素存到陣列中,如下 string name a,b,c,r,string names1 name.split 期待得到的陣列長度是8,結果得到的長度是4,因為結尾的空字串都被丟棄了。後來查到該方法還有乙個過載,split string...
更好的優化
這次介紹幾個更好的優化,回憶一下 損失函式 梯度 優化 一節我們所介紹的內容,我們介紹了最簡單的優化演算法 隨機梯度下降 sgd 然而,這個演算法難以處理一些比較奇怪的情況,讓我們來看看。引例損失函式的梯度登高表述如下圖等高線,在這類函式上如果執行sgd,由於在豎直方向上梯度比較高,所以步長 梯度帶...
更好的規劃人生
1 不說 不可能 2 凡事第一反應 找方法,不找藉口 3 遇到挫折對自己說聲 太好了,機會來了!4 不說消極的話,不落入消極的情緒,一旦發生立即正面處理 5 凡事先訂立目標 6 行動前,預先做計畫 7 工作時間,每一分 每一秒做有利於生產的事情 8 隨時用零碎的時間做零碎的事情 9 守時 10 寫點...