娣卞叆StringBuffer
浣滆?eckel_cn
鏈榪?闂叉殗涔嬩綑,閲嶆柊鏁寸悊鑷敤鐨凷tringUtil綾?鍦ㄦ暣鐞嗗埌repeat鏂規硶(閲嶅瀛楃涓?鏃?鍙戠幇鍏跺瓨鍦ㄦ晥鐜囬棶棰?渚挎墦綆楅噸鏂板啓涓涓?鍗村彂鐜頒簡涓緋誨垪浠ュ墠娌″お娉ㄦ剰鐨勪笢瑗?瑙夊緱寰堟湁蹇呰鍐欎笅鏉?
鍒濅竴鐪?灝辮兘鍙戠幇涓鐐歸棶棰?褰搉寰堝ぇ,杈懼埌涓瀹氬ぇ灝?灝辮兘浣垮爢鏍堟孩鍑?鍑虹幇OutOfMemery閿欒.
閭e浣曢伩鍏嶈繖涓棶棰樺憿,鎴戦┈涓婃兂鍒頒簡,鏃㈢劧StringBuffer鍜孲tring涓鏍峰唴閮ㄩ兘鏄湪鎿嶄綔char鏁扮粍,
閭f垜灝辮嚜宸辯洿鎺ユ搷浣渃har鏁扮粍,鍦ㄦ渶灝戠殑寰幆閲岄潰,濉厖char鏁扮粍,浠g爜濡備笅:
1
public static String repeat2(String str, int n)
{
2
int len = str.length();
3
int maxlen = len * n;
4
char[] chars = new char[len * n];
5
str.getChars(0, len, chars, 0);
6
int count = len;
7
int copyLen = 0;
8
while ((copyLen = maxlen - count > count ? count : maxlen - count) > 0)
{
9
System.arraycopy(chars, 0, chars, count, copyLen);
10
count += copyLen;
11
}
12
String outstr = new String(chars);
13
return outstr;
14
}
嫻嬭瘯鍚?鍙戠幇,寰幆鎺у埗鍦ㄤ簡鏈灝?浣嗘槸,鎬ц兘鍗磋繕涓嶅repeat1,涔熻浣犱細鍜屾垜涓鏍峰紑濮嬪緢鎯婅,浣嗙湅浜?BR>StringBuffer鐨勫疄鐜板悗,鍙戠幇repeat2鐨勫疄鐜頒腑,灝哻har鏁扮粍,杞崲涓篠tring,鏄晥鐜囧涔堜綆鐨勪簨鎯?榪欎釜榪囩▼闇瑕佸湪String鍐呴儴閲嶆柊鍒涘緩涓涓猚har鏁扮粍,鐒跺悗鎶婁紶榪涘幓鐨刢har鏁扮粍,澶嶅埗緇欏畠.鑰宺epeat1涓負浠涔堟病鏈夎繖涓ц兘闂鍛?鍏跺疄榪欏氨鏄褰掑姛浜嶴UN鍦ㄥ疄鐜癝tringBuffer涓殑涓涓噸瑕佸睘鎬?shared,褰撲綘浣跨敤StringBuffer鍚?鎯沖緱鍒癝tring鏃?String浼氬叡浜玈tringBuffer涓殑char鏁扮粍,榪欐牱涓鏉?鎬ц兘闈炲父楂?
鍏變韓浼氫笉浼氬甫鏉ュ壇浣滅敤鍛?SUN鐨勫疄鐜板綋鐒惰冭檻鍒頒簡,鍦ㄦ敼鍙楽tringBuffer鏃?濡傛灉榪欎釜StringBuffer
鏈夊叾浠朣tring鍏變韓瀹冪殑char鏁扮粍鏃?StringBuffer灝辨妸榪欎釜char鏁扮粍璁╃粰String,鑷繁閲嶆柊澶嶅埗涓浠戒嬌鐢?
鏃㈢劧闂鍙戠幇浜?鎴戝張鎹簡縐嶇畻娉曟潵瀹炵幇,鍚屾牱涔熸槸鎶婂驚鐜帶鍒跺湪鏈灝?鍚屾椂瑙e喅杞崲甯︽潵鐨勬晥鐜囦綆涓嬮棶棰?
1
public static String repeat3(String str, int n)
{
2
// if input string is null,return null.
3
if (null == str)
{
4
return null;
5
}
6
final int strlen = str.length();
7
// if repeat number is less than two or given string's length is zero,
8
// then return the givien string.
9
if (2 > n || 0 == strlen)
{
10
return str;
11
}
12
// assigns the enough size for the string buffer.
13
StringBuffer strBuf = new StringBuffer(strlen * n);
14
// get odd length flag.
15
final boolean oddLen = n % 2 == 1 ? true : false;
16
// calculates the grow times.
17
final int growTimes = (int) Math.floor(Math.log(n) / Math.log(2));
18
// adds one given string.
19
strBuf.append(str);
20
// grows until more than half of the repeat count.
21
for (int i = 0; i < growTimes; i++)
{
22
strBuf.append(strBuf);
23
if (Math.pow(2, i - 1) * 2 < n && Math.pow(2, i) * 2 >= n)
{
24
break;
25
}
26
}
27
// reset the string buffer's length to half of the repeat count.
28
strBuf.setLength(strlen * Math.round(n / 2));
29
// grows to the repeat count.
30
strBuf.append(strBuf);
31
if (oddLen)
{
32
strBuf.append(str);
33
}
34
String returnStr = new String(strBuf);
35
return returnStr;
36
}
37
綆楁硶瀹炵幇,鍐嶆嫻嬭瘯,嫻嬭瘯鍙戠幇,鍦ㄨ妯′笉鏄壒鍒ぇ鐨勬儏鍐典笅,repeat3鐨勬晥鐜囪鏄庢樉浼樹簬鍓嶄袱涓?浣嗗湪瑙勬ā澶х殑鎯呭喌涓?浼氬彉鐨勫樊涓嶅,鎬庝箞浼氳繖鏍風殑鍛?鍐嶆榪涜娣卞叆璋冩煡,緇撴灉鍙戠幇鏄疭UN鐨凷ystem.arrayCopy榪欎釜鏂規硶鏈夋ц兘闂,鐗瑰埆鏄綋瑕佸鍒剁殑闀垮害鐗瑰埆澶х殑鎯呭喌涓?鎬ц兘涓嬮檷鐨勬瘮杈冨揩,鍐嶆崲涓狪BM鐨凧DK瀹炵幇,鍙堝彂鐜?IBM鐨勮繖涓柟娉曠殑瀹炵幇瑕佹瘮SUN鏈夋敼榪?
鐪熸槸涓嬈℃瘮杈冩湁鎰忔濈殑娣卞叆StringBuffer,鍦ㄥ疄闄呰繍鐢ㄤ腑repeat3瀹屽叏鍙互浠f浛涓婇潰涓ょ鏂規硶.

]]>