浼樺寲鍙樻垚浜嗗咖鎮o細String.split寮曞彂鐨勨€滃唴瀛樻硠闇测€

浼樺寲鍙樻垚浜嗗咖鎮o細String.split寮曞彂鐨勨€滃唴瀛樻硠闇测€?

涓€鐩磋禐鍙筍un瀵瑰緟鎶€鏈殑涓ヨ皑鍜屼紭闆咃紙bless Sun锛夈€係un JDK涓璊ava搴撶殑婧愪唬鐮侊紝杩炴敞閲婇兘娓呮竻妤氭銆佽瑙勮寖鑼冿紝javadoc娉ㄨВ鐨勪娇鐢ㄤ篃涓€涓濅笉鑻燂紝璇昏捣鏉ュ緢鐔熻垝鏈嶃€傚洜姝わ紝鍦ㄦ棩甯稿伐浣滃拰瀛︿範涓紝缁忓父璇昏 Java搴撶殑婧愪唬鐮侊紝涓嶄害涔愪箮锛熷鏋滈亣鍒拌寮傞棶棰橈紝婧愪唬鐮佺殑甯姪灏辨洿澶т簡銆?/p>

闂茶瘽灏戣锛屽洖褰掓棰樸€傝繖鍑犲ぉ锛屼竴鐩村湪涓篔ava鐨勨€滃唴瀛樻硠闇测€濋棶棰樼籂缁撱€侸ava搴旂敤绋嬪簭鍗犵敤鐨勫唴瀛樺湪涓嶆柇鐨勩€佹湁瑙勫緥鐨勪笂娑紝鏈€缁堣秴杩囦簡鐩戞帶闃堝€笺€?绂忓皵鎽╂柉涓嶅緱涓嶅嚭鎵嬩簡锛?/p>

璇磋捣Java鐨勫唴瀛樻硠闇诧紝鍏跺疄瀹氫箟涓嶆槸閭d箞鏄庣‘銆傞鍏堬紝濡傛灉JVM娌℃湁bug锛岄偅涔堢悊璁轰笂鏄笉浼氬嚭鐜扳€滄棤娉曞洖鏀剁殑鍫嗙┖闂粹€濓紝涔熷氨鏄C/C++涓殑 閭g鍐呭瓨娉勯湶鍦↗ava涓笉瀛樺湪鐨勩€傚叾娆★紝濡傛灉鐢变簬Java绋嬪簭涓€鐩存寔鏈夋煇涓璞$殑寮曠敤锛屼絾鏄粠绋嬪簭閫昏緫涓婄湅锛岃繖涓璞″啀涔熶笉浼氳鐢ㄥ埌浜嗭紝閭d箞鎴戜滑鍙互璁?涓鸿繖涓璞¤娉勯湶浜嗐€傚鏋滆繖鏍风殑瀵硅薄鏁伴噺寰堝锛岄偅涔堝緢鏄庢樉锛屽ぇ閲忕殑鍐呭瓨绌洪棿灏辫娉勯湶锛堚€滄氮璐光€濇洿鍑嗙‘涓€浜涳級浜嗐€?/p>

涓嶈繃锛屾湰鏂囪璇寸殑鍐呭瓨娉勯湶锛屽苟涓嶅睘浜庝笂杩板師鍥狅紝鍥犳鎵撲笂浜嗗紩鍙枫€傚叾鍏蜂綋鍘熷洜锛岀‘瀹炲嚭涔庢剰鏂欍€傛鐭ヨ鎯咃紝璇风湅涓嬮潰璁茶В銆?/p>

鍒嗘瀽鍐呭瓨娉勯湶鐨勪竴鑸楠?/strong>

濡傛灉鍙戠幇Java搴旂敤绋嬪簭鍗犵敤鐨勫唴瀛樺嚭鐜颁簡娉勯湶鐨勮抗璞★紝閭d箞鎴戜滑涓€鑸噰鐢ㄤ笅闈㈢殑姝ラ鍒嗘瀽

  1. 鎶奐ava搴旂敤绋嬪簭浣跨敤鐨刪eap dump涓嬫潵
  2. 浣跨敤Java heap鍒嗘瀽宸ュ叿锛屾壘鍑哄唴瀛樺崰鐢ㄨ秴鍑洪鏈燂紙涓€鑸槸鍥犱负鏁伴噺澶锛夌殑瀚岀枒瀵硅薄
  3. 蹇呰鏃讹紝闇€瑕佸垎鏋愬珜鐤戝璞″拰鍏朵粬瀵硅薄鐨勫紩鐢ㄥ叧绯汇€?/li>
  4. 鏌ョ湅绋嬪簭鐨勬簮浠g爜锛屾壘鍑哄珜鐤戝璞℃暟閲忚繃澶氱殑鍘熷洜銆?/li>

dump heap

濡傛灉Java搴旂敤绋嬪簭鍑虹幇浜嗗唴瀛樻硠闇诧紝鍗冧竾鍒潃鎬ョ潃鎶婂簲鐢ㄦ潃鎺夛紝鑰屾槸瑕佷繚瀛樼幇鍦恒€傚鏋滄槸浜掕仈缃戝簲鐢紝鍙互鎶婃祦閲忓垏鍒板叾浠栨湇鍔″櫒銆備繚瀛樼幇鍦虹殑鐩殑灏辨槸 涓轰簡鎶婅繍琛屼腑JVM鐨刪eap dump涓嬫潵銆?/p>

JDK鑷甫鐨刯map宸ュ叿锛屽彲浠ュ仛杩欎欢浜嬫儏銆傚畠鐨勬墽琛屾柟娉曟槸锛?/p>

jmap -dump:format=b,file=heap.bin <pid>

format=b鐨勫惈涔夋槸锛宒ump鍑烘潵鐨勬枃浠舵椂浜岃繘鍒舵牸寮忋€?/p>

file-heap.bin鐨勫惈涔夋槸锛宒ump鍑烘潵鐨勬枃浠跺悕鏄痟eap.bin銆?/p>

<pid>灏辨槸JVM鐨勮繘绋嬪彿銆?/p>

锛堝湪linux涓嬶級鍏堟墽琛宲s aux | grep java锛屾壘鍒癑VM鐨刾id锛涚劧鍚庡啀鎵цjmap -dump:format=b,file=heap.bin <pid>锛屽緱鍒癶eap dump鏂囦欢銆?/p>

analyze heap

灏嗕簩杩涘埗鐨刪eap dump鏂囦欢瑙f瀽鎴恏uman-readable鐨勪俊鎭紝鑷劧鏄渶瑕佷笓涓氬伐鍏风殑甯姪锛岃繖閲屾帹鑽?a target="_blank" href="http://www.eclipse.org/mat/">Memory Analyzer 銆?/p>

Memory Analyzer锛岀畝绉癕AT锛屾槸Eclipse鍩洪噾浼氱殑寮€婧愰」鐩紝鐢盨AP鍜孖BM鎹愬姪銆傚法澶村叕鍙稿嚭鍝佺殑杞欢杩樻槸寰堜腑鐢ㄧ殑锛孧AT鍙互鍒嗘瀽鍖呭惈鏁颁嚎绾у 璞$殑heap銆佸揩閫熻绠楁瘡涓璞″崰鐢ㄧ殑鍐呭瓨澶у皬銆佸璞′箣闂寸殑寮曠敤鍏崇郴銆佽嚜鍔ㄦ娴嬪唴瀛樻硠闇茬殑瀚岀枒瀵硅薄锛屽姛鑳藉己澶э紝鑰屼笖鐣岄潰鍙嬪ソ鏄撶敤銆?/p>

MAT鐨勭晫闈㈠熀浜嶦clipse寮€鍙戯紝浠ヤ袱绉嶅舰寮忓彂甯冿細Eclipse鎻掍欢鍜孍clipe RCP銆侻AT鐨勫垎鏋愮粨鏋滀互鍥剧墖鍜屾姤琛ㄧ殑褰㈠紡鎻愪緵锛屼竴鐩簡鐒躲€傛€讳箣涓汉杩樻槸闈炲父鍠滄杩欎釜宸ュ叿鐨勩€備笅闈㈠厛璐翠袱寮犲畼鏂圭殑screenshots锛?/p>

浼樺寲鍙樻垚浜嗗咖鎮o細String.split寮曞彂鐨勨€滃唴瀛樻硠闇测€

瑷€褰掓浼狅紝鎴戠敤MAT鎵撳紑浜唄eap.bin锛屽緢瀹规槗鐪嬪嚭锛?strong>char[]鐨勬暟閲忓嚭鍏舵剰鏂欑殑澶氾紝鍗犵敤90%浠ヤ笂鐨勫唴瀛?/strong> 銆備竴鑸潵璇达紝char[]鍦↗VM纭疄浼氬崰鐢ㄥ緢澶氬唴瀛橈紝鏁伴噺涔熼潪甯稿锛屽洜涓篠tring瀵硅薄浠har[]浣滀负鍐呴儴瀛樺偍銆備絾鏄繖娆$殑char[]澶椽濠?浜嗭紝浠旂粏涓€瑙傚療锛?strong>鍙戠幇鏈夋暟涓囪鐨刢har[]锛屾瘡涓兘鍗犵敤鏁扮櫨K鐨勫唴瀛?/strong> 銆傝繖涓幇璞¤鏄庯紝Java绋嬪簭淇濆瓨浜嗘暟浠ヤ竾璁$殑澶tring瀵硅薄 銆傜粨鍚堢▼搴忕殑閫昏緫锛岃繖涓槸涓嶅簲璇ョ殑锛岃偗瀹氬湪鏌愪釜鍦版柟鍑轰簡闂銆?/p>

椤鸿棨鎽哥摐

鍦ㄥ彲鐤戠殑char[]涓紝浠绘剰鎸戜簡涓€涓紝浣跨敤Path To GC Root鍔熻兘锛屾壘鍒拌char[]鐨勫紩鐢ㄨ矾寰勶紝鍙戠幇String瀵硅薄鏄涓€涓狧ashMap涓紩鐢ㄧ殑 銆傝繖涓篃鏄剰鏂欎腑鐨勪簨鎯咃紝Java鐨勫唴瀛樻硠闇插鍗婃槸鍥犱负瀵硅薄琚仐鐣欏湪鍏ㄥ眬鐨凥ashMap涓緱涓嶅埌閲婃斁銆備笉杩囷紝璇ashMap琚敤浣滀竴涓紦瀛橈紝璁剧疆浜嗙紦 瀛樻潯鐩殑闃堝€硷紝瀵艰揪鍒伴槇鍊煎悗浼氳嚜鍔ㄦ窐姹般€備粠杩欎釜閫昏緫鍒嗘瀽锛屽簲璇ヤ笉浼氬嚭鐜板唴瀛樻硠闇茬殑銆傝櫧鐒剁紦瀛樹腑鐨凷tring瀵硅薄宸茬粡杈惧埌鏁颁竾璁★紝浣嗕粛鐒舵病鏈夎揪鍒伴鍏堣缃?鐨勯槇鍊硷紙闃堝€艰缃湴姣旇緝澶э紝鍥犱负褰撴椂棰勪及String瀵硅薄閮芥瘮杈冨皬锛夈€?/p>

浣嗘槸锛屽彟涓€涓棶棰樺紩璧蜂簡鎴戠殑娉ㄦ剰锛氫负浠€涔堢紦瀛樼殑String瀵硅薄濡傛宸ㄥぇ锛熷唴閮╟har[]鐨勯暱搴﹁揪鏁扮櫨K銆?strong>铏界劧缂撳瓨涓殑String瀵硅薄鏁?閲忚繕娌℃湁杈惧埌闃堝€硷紝浣嗘槸String瀵硅薄澶у皬杩滆繙瓒呭嚭浜嗘垜浠殑棰勬湡锛屾渶缁堝鑷村唴瀛樿澶ч噺娑堣€楋紝褰㈡垚鍐呭瓨娉勯湶鐨勮抗璞★紙鍑嗙‘璇村簲璇ユ槸鍐呭瓨娑堣€楄繃澶氾級 銆?/p>

灏辫繖涓棶棰樿繘涓€姝ラ『钘ゆ懜鐡滐紝鐪嬬湅String澶у璞℃槸濡備綍琚斁鍒癏ashMap涓殑銆傞€氳繃鏌ョ湅绋嬪簭鐨勬簮浠g爜锛屾垜鍙戠幇锛岀‘瀹炴湁String澶у璞★紝涓?杩囧苟娌℃湁鎶奡tring澶у璞℃斁鍒癏ashMap涓紝鑰屾槸鎶奡tring澶у璞¤繘琛宻plit锛堣皟鐢⊿tring.split鏂规硶锛夛紝鐒跺悗灏唖plit鍑?鏉ョ殑String灏忓璞℃斁鍒癏ashMap涓?/strong> 浜嗐€?/p>

杩欏氨濂囨€簡锛屾斁鍒癏ashMap涓槑鏄庢槸split涔嬪悗鐨凷tring灏忓璞★紝鎬庝箞浼氬崰鐢ㄩ偅涔堝ぇ绌洪棿鍛紵闅鹃亾鏄疭tring绫荤殑split鏂规硶鏈夐棶 棰橈紵

鏌ョ湅浠g爜

甯︾潃涓婅堪鐤戦棶锛屾垜鏌ラ槄浜哠un JDK6涓璖tring绫荤殑浠g爜锛屼富瑕佹槸鏄痵plit鏂规硶鐨勫疄鐜帮細

[java] view plaincopyprint?
  1. public聽聽聽
  2. String[]聽split(String聽regex,聽int聽limit)聽{聽聽
  3. 聽聽聽聽return聽Pattern.compile(regex).split(this,聽limit);聽聽
  4. }聽聽

鍙互鐪嬪嚭锛孲tirng.split鏂规硶璋冪敤浜哖attern.split鏂规硶銆傜户缁湅Pattern.split鏂规硶鐨勪唬鐮侊細

[java] view plaincopyprint?
  1. public聽聽聽
  2. String[]聽split(CharSequence聽input,聽int聽limit)聽{聽聽
  3. 聽聽聽聽聽聽聽聽int聽index聽=聽0;聽聽
  4. 聽聽聽聽聽聽聽聽boolean聽matchLimited聽=聽limit聽>聽0;聽聽
  5. 聽聽聽聽聽聽聽聽ArrayList<String>聽matchList聽=聽new聽聽聽
  6. ArrayList<String>();聽聽
  7. 聽聽聽聽聽聽聽聽Matcher聽m聽=聽matcher(input);聽聽
  8. 聽聽聽聽聽聽聽聽//聽Add聽segments聽before聽each聽match聽found聽聽
  9. 聽聽聽聽聽聽聽聽while(m.find())聽{聽聽
  10. 聽聽聽聽聽聽聽聽聽聽聽聽if聽(!matchLimited聽||聽matchList.size()聽<聽limit聽-聽1)聽{聽聽
  11. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽String聽match聽=聽input.subSequence(index,聽聽聽
  12. m.start()).toString();聽聽
  13. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽matchList.add(match);聽聽
  14. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽index聽=聽m.end();聽聽
  15. 聽聽聽聽聽聽聽聽聽聽聽聽}聽elseif聽(matchList.size()聽==聽limit聽-聽1)聽{聽//聽last聽one聽聽
  16. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽String聽match聽=聽input.subSequence(index,聽聽
  17. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
  18. input.length()).toString();聽聽
  19. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽matchList.add(match);聽聽
  20. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽index聽=聽m.end();聽聽
  21. 聽聽聽聽聽聽聽聽聽聽聽聽}聽聽
  22. 聽聽聽聽聽聽聽聽}聽聽
  23. 聽聽聽聽聽聽聽聽//聽If聽no聽match聽was聽found,聽return聽this聽聽
  24. 聽聽聽聽聽聽聽聽if聽(index聽==聽0)聽聽
  25. 聽聽聽聽聽聽聽聽聽聽聽聽returnnew聽String[]聽{input.toString()};聽聽
  26. 聽聽聽聽聽聽聽聽//聽Add聽remaining聽segment聽聽
  27. 聽聽聽聽聽聽聽聽if聽(!matchLimited聽||聽matchList.size()聽<聽limit)聽聽
  28. 聽聽聽聽聽聽聽聽聽聽聽聽matchList.add(input.subSequence(index,聽聽聽
  29. input.length()).toString());聽聽
  30. 聽聽聽聽聽聽聽聽//聽Construct聽result聽聽
  31. 聽聽聽聽聽聽聽聽int聽resultSize聽=聽matchList.size();聽聽
  32. 聽聽聽聽聽聽聽聽if聽(limit聽==聽0)聽聽
  33. 聽聽聽聽聽聽聽聽聽聽聽聽while聽(resultSize聽>聽0聽&&聽聽聽
  34. matchList.get(resultSize-1).equals(""))聽聽
  35. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽resultSize--;聽聽
  36. 聽聽聽聽聽聽聽聽String[]聽result聽=聽new聽String[resultSize];聽聽
  37. 聽聽聽聽聽聽聽聽return聽matchList.subList(0,聽resultSize).toArray(result);聽聽
  38. 聽聽聽聽}聽聽

娉ㄦ剰鐪嬬11琛岋細Stirng match = input.subSequence(intdex, m.start()).toString();

杩欓噷鐨刴atch灏辨槸split鍑烘潵鐨凷tring灏忓璞★紝瀹冨叾瀹炴槸String澶у璞ubSequence鐨勭粨鏋溿€傜户缁湅 String.subSequence鐨勪唬鐮侊細

[java] view plaincopyprint?
  1. public聽聽聽
  2. CharSequence聽subSequence(int聽beginIndex,聽int聽endIndex)聽{聽聽
  3. 聽聽聽聽聽聽聽聽returnthis.substring(beginIndex,聽endIndex);聽聽
  4. }聽聽

String.subSequence鏈夎皟鐢ㄤ簡String.subString锛岀户缁湅锛?/p>

[java] view plaincopyprint?
  1. public聽String聽聽聽
  2. substring(int聽beginIndex,聽int聽endIndex)聽{聽聽
  3. 聽聽聽聽if聽(beginIndex聽<聽0)聽{聽聽
  4. 聽聽聽聽聽聽聽聽thrownew聽StringIndexOutOfBoundsException(beginIndex);聽聽
  5. 聽聽聽聽}聽聽
  6. 聽聽聽聽if聽(endIndex聽>聽count)聽{聽聽
  7. 聽聽聽聽聽聽聽聽thrownew聽StringIndexOutOfBoundsException(endIndex);聽聽
  8. 聽聽聽聽}聽聽
  9. 聽聽聽聽if聽(beginIndex聽>聽endIndex)聽{聽聽
  10. 聽聽聽聽聽聽聽聽thrownew聽StringIndexOutOfBoundsException(endIndex聽-聽beginIndex);聽聽
  11. 聽聽聽聽}聽聽
  12. 聽聽聽聽return聽((beginIndex聽==聽0)聽&&聽(endIndex聽==聽count))聽?聽this聽:聽聽
  13. 聽聽聽聽聽聽聽聽new聽String(offset聽+聽beginIndex,聽endIndex聽-聽beginIndex,聽value);聽聽
  14. 聽聽聽聽}聽聽

鐪嬬12銆?3琛岋紝鎴戜滑缁堜簬鐪嬪嚭鐪夌洰锛屽鏋渟ubString鐨勫唴瀹瑰氨鏄畬鏁寸殑鍘熷瓧绗︿覆锛岄偅涔堣繑鍥炲師String瀵硅薄锛涘惁鍒欙紝灏变細鍒涘缓涓€涓柊鐨?String瀵硅薄锛屼絾鏄繖涓猄tring瀵硅薄璨屼技浣跨敤浜嗗師String瀵硅薄鐨刢har[]銆傛垜浠€氳繃String鐨勬瀯閫犲嚱鏁扮‘璁よ繖涓€鐐癸細

[java] view plaincopyprint?
  1. //聽Package聽聽聽
  2. private聽constructor聽which聽shares聽value聽array聽for聽speed.聽聽
  3. 聽聽聽聽String(int聽offset,聽int聽count,聽char聽value[])聽{聽聽
  4. 聽聽聽聽this.value聽=聽value;聽聽
  5. 聽聽聽聽this.offset聽=聽offset;聽聽
  6. 聽聽聽聽this.count聽=聽count;聽聽
  7. 聽聽聽聽}聽聽

涓轰簡閬垮厤鍐呭瓨鎷疯礉銆佸姞蹇€熷害锛孲un JDK鐩存帴澶嶇敤浜嗗師String瀵硅薄鐨刢har[]锛屽亸绉婚噺鍜岄暱搴︽潵鏍囪瘑涓嶅悓鐨勫瓧绗︿覆鍐呭銆備篃灏辨槸璇达紝subString 鍑虹殑鏉tring灏忓璞′粛鐒朵細鎸囧悜鍘烻tring澶у璞$殑char[]锛宻plit涔熸槸鍚屾牱鐨勬儏鍐?/strong> 銆傝繖灏辫В閲婁簡锛屼负浠€涔圚ashMap涓璖tring瀵硅薄鐨刢har[]閮介偅涔堝ぇ銆?/p>

鍘熷洜瑙i噴

鍏跺疄涓婁竴鑺傚凡缁忓垎鏋愬嚭浜嗗師鍥狅紝杩欎竴鑺傚啀鏁寸悊涓€涓嬶細

  1. 绋嬪簭浠庢瘡涓姹備腑寰楀埌涓€涓猄tring澶у璞★紝璇ュ璞″唴閮╟har[]鐨勯暱搴﹁揪鏁扮櫨K銆?/li>
  2. 绋嬪簭瀵筍tring澶у璞″仛split锛屽皢split寰楀埌鐨凷tring灏忓璞℃斁鍒癏ashMap涓紝鐢ㄤ綔缂撳瓨銆?/li>
  3. Sun JDK6瀵筍tring.split鏂规硶鍋氫簡浼樺寲锛宻plit鍑烘潵鐨凷tirng瀵硅薄鐩存帴浣跨敤鍘烻tring瀵硅薄鐨刢har[]
  4. HashMap涓殑姣忎釜String瀵硅薄鍏跺疄閮芥寚鍚戜簡涓€涓法澶х殑char[]
  5. HashMap鐨勪笂闄愭槸涓囩骇鐨勶紝鍥犳琚紦瀛樼殑Sting瀵硅薄鐨勬€诲ぇ灏?涓?鐧綤=G绾с€?/li>
  6. G绾х殑鍐呭瓨琚紦瀛樺崰鐢ㄤ簡锛屽ぇ閲忕殑鍐呭瓨琚氮璐癸紝閫犳垚鍐呭瓨娉勯湶鐨勮抗璞°€?strong>

瑙e喅鏂规

鍘熷洜鎵惧埌浜嗭紝瑙e喅鏂规涔熷氨鏈変簡銆俿plit鏄鐢ㄧ殑锛屼絾鏄垜浠笉瑕佹妸split鍑烘潵鐨凷tring瀵硅薄鐩存帴鏀惧埌HashMap涓紝鑰屾槸璋冪敤涓€涓?String鐨勬嫹璐濇瀯閫犲嚱鏁癝tring(String original)锛岃繖涓瀯閫犲嚱鏁版槸瀹夊叏鐨勶紝鍏蜂綋鍙互鐪嬩唬鐮侊細

[java] view plaincopyprint?
  1. 聽聽聽聽/**
  2. 聽聽聽聽聽*聽Initializes聽a聽newly聽created聽{@code聽String}聽object聽so聽that聽it聽
  3. represents
  4. 聽聽聽聽聽*聽the聽same聽sequence聽of聽characters聽as聽the聽argument;聽in聽other聽words,聽
  5. the
  6. 聽聽聽聽聽*聽newly聽created聽string聽is聽a聽copy聽of聽the聽argument聽string.聽Unless聽an
  7. 聽聽聽聽聽*聽explicit聽copy聽of聽{@code聽original}聽is聽needed,聽use聽of聽this聽
  8. constructor聽is
  9. 聽聽聽聽聽*聽unnecessary聽since聽Strings聽are聽immutable.
  10. 聽聽聽聽聽*
  11. 聽聽聽聽聽*聽@param聽聽original
  12. 聽聽聽聽聽*聽聽聽聽聽聽聽聽聽A聽{@code聽String}
  13. 聽聽聽聽聽*/聽聽
  14. 聽聽聽聽public聽String(String聽original)聽{聽聽
  15. 聽聽聽聽int聽size聽=聽original.count;聽聽
  16. 聽聽聽聽char[]聽originalValue聽=聽original.value;聽聽
  17. 聽聽聽聽char[]聽v;聽聽
  18. 聽聽聽聽if聽(originalValue.length聽>聽size)聽{聽聽
  19. 聽聽聽聽聽聽聽聽//聽The聽array聽representing聽the聽String聽is聽bigger聽than聽the聽new聽聽
  20. 聽聽聽聽聽聽聽聽//聽String聽itself.聽聽Perhaps聽this聽constructor聽is聽being聽called聽聽
  21. 聽聽聽聽聽聽聽聽//聽in聽order聽to聽trim聽the聽baggage,聽so聽make聽a聽copy聽of聽the聽array.聽聽
  22. 聽聽聽聽聽聽聽聽聽聽聽聽int聽off聽=聽original.offset;聽聽
  23. 聽聽聽聽聽聽聽聽聽聽聽聽v聽=聽Arrays.copyOfRange(originalValue,聽off,聽off+size);聽聽
  24. 聽聽聽聽}聽else聽{聽聽
  25. 聽聽聽聽聽聽聽聽//聽The聽array聽representing聽the聽String聽is聽the聽same聽聽
  26. 聽聽聽聽聽聽聽聽//聽size聽as聽the聽String,聽so聽no聽point聽in聽making聽a聽copy.聽聽
  27. 聽聽聽聽聽聽聽聽v聽=聽originalValue;聽聽
  28. 聽聽聽聽}聽聽
  29. 聽聽聽聽this.offset聽=聽0;聽聽
  30. 聽聽聽聽this.count聽=聽size;聽聽
  31. 聽聽聽聽this.value聽=聽v;聽聽
  32. 聽聽聽聽}聽聽

鍙槸锛宯ew String(string)鐨勪唬鐮佸緢鎬紓锛屽洤銆傛垨璁革紝subString鍜宻plit搴旇鎻愪緵涓€涓€夐」锛岃绋嬪簭鍛樻帶鍒舵槸鍚﹀鐢⊿tring瀵硅薄鐨?char[]銆?/p>

鏄惁鏄疊ug

铏界劧锛宻ubString鍜宻plit鐨勫疄鐜伴€犳垚浜嗙幇鍦ㄧ殑闂锛屼絾鏄繖鑳藉惁绠桽tring绫荤殑bug鍛紵涓汉瑙夊緱涓嶅ソ璇淬€傚洜涓鸿繖鏍风殑浼樺寲鏄瘮杈冨悎鐞?鐨勶紝subString鍜宻pit鐨勭粨鏋滆偗瀹氭槸鍘熷瓧绗︿覆鐨勮繛缁瓙搴忓垪銆傚彧鑳借锛孲tring涓嶄粎浠呮槸涓€涓牳蹇冪被锛屽畠瀵逛簬JVM鏉ヨ鏄笌鍘熷绫诲瀷鍚岀瓑閲嶈鐨?绫诲瀷銆?/p>

JDK瀹炵幇瀵筍tring鍋氬悇绉嶅彲鑳界殑浼樺寲閮芥槸鍙互鐞嗚В鐨勩€備絾鏄紭鍖栧甫鏉ヤ簡蹇ф偅锛屾垜浠▼搴忓憳瓒冲浜嗚В浠栦滑锛屾墠鑳界敤濂戒粬浠€?/p>