String split的更好認識

2021-08-25 15:06:27 字數 1684 閱讀 1710

今天檢視了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 寫點...