1. 程式人生 > >下劃線轉駝峰,3種實現方式效率對比

下劃線轉駝峰,3種實現方式效率對比

一時興起想要比較一下效率如何,也順便貼上程式碼。總體而言,無論是駝峰轉下劃線還是下劃線轉駝峰,一般而言都不會超過5個毫秒,但是這個功能畢竟簡單,積少成多之下,也會顯得有些慢。鑑於毫秒的精度不夠,我採用納秒來量化執行效率。結論是:1.在使用java自帶的正則表示式工具Pattern和Matcher的情況下,耗時非常大,最少也要約300萬納秒約合3毫秒才能完成,而基於字串split或者replace,一般只需要70萬納秒約合0.7毫秒。但是正則工具的程式碼結構邏輯簡單,而基於字串的拆分和替換操作看起來有較多for和if而有些混亂。2.基於StringBuilder進行字串append效率和基於String的字串拼接,在當前場合下效率差距不大,多數情況下兩者都有時間波動偶爾有較大波動,可能和執作的時候CPU時間片分配有關。3.此後的執行時間從5萬納秒到4萬納秒遞減,與第一次時間差距非常大,應該是字串常量池此時起了作用。速度非常快。4.綜合而言,從下劃線轉化為駝峰,比較快的情況穩定在50w納秒左右,而從駝峰轉化為下劃線,耗時大大減少,比較快的情況下不到10萬納秒,常量池其作用後,耗時不足1w納秒,相當於幾個微秒就完成了。環境資訊:I5-6300HQ,12GDDR3記憶體,win10家庭版。程式碼如下:實踐證明這種小功能測效率純粹是閒的蛋疼……
  1. package json.util;
  2. import java.util.Arrays;
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5. /**
  6. * Created by tm on 2016/11/24.
  7. * time : 15:45
  8. * project_name : code
  9. */
  10. publicclassUnderLineString2Camel{
  11. /**
  12. * 下劃線轉駝峰
  13. * @param underline
  14. * @return
  15. */
  16. publicstaticString underline2Camel(String
    underline){
  17. Pattern pattern =Pattern.compile("[_]\\w");
  18. String camel = underline.toLowerCase();
  19. Matcher matcher = pattern.matcher(camel);
  20. while(matcher.find()){
  21. String w = matcher.group().trim();
  22. camel = camel.replace(w,w.toUpperCase().replace("_",""));
  23. }
  24. return camel;
  25. }
  26. /**
  27. * 駝峰轉下劃線
  28. * @param camel
  29. * @return
  30. */
  31. publicstaticStringCamel2Underline(String camel){
  32. Pattern pattern =Pattern.compile("[A-Z]");
  33. Matcher matcher = pattern.matcher(camel);
  34. while(matcher.find()){
  35. String w = matcher.group().trim();
  36. camel = camel.replace(w,"_"+w);
  37. }
  38. return camel.toUpperCase();
  39. }
  40. /**
  41. * 駝峰轉下劃線。
  42. * @param camel
  43. * @return
  44. */
  45. publicstaticStringCamel2Underline2(String camel){
  46. char[] chars = camel.toCharArray();
  47. StringBuilder sb =newStringBuilder();
  48. for(int i=0,j=0;i<chars.length;i++,j++){
  49. char s = chars[i];
  50. if(s+1>65&& s+1<91){
  51. char _ =95;
  52. sb.append(_);
  53. j++;
  54. sb.append(s);
  55. continue;
  56. }
  57. sb.append(s);
  58. }
  59. return sb.toString().toUpperCase();
  60. }
  61. publicstaticvoid main(String[] args){
  62. for(int i =0;i<10;i++){
  63. long start =System.nanoTime();
  64. camelNamesb("QW_ABD_XYZN");
  65. System.out.println(System.nanoTime()- start);
  66. }
  67. }
  68. publicstaticString camelName(String name){
  69. String result ="";
  70. // 快速檢查
  71. if(name ==null|| name.isEmpty()){
  72. // 沒必要轉換
  73. return"";
  74. }elseif(!name.contains("_")){
  75. // 不含下劃線,僅將首字母小寫
  76. return name.substring(0,1).toLowerCase()+ name.substring(1);
  77. }
  78. // 用下劃線將原始字串分割
  79. String camels[]= name.split("_");
  80. for(String camel : camels){
  81. // 跳過原始字串中開頭、結尾的下換線或雙重下劃線
  82. if(camel.isEmpty()){
  83. continue;
  84. }
  85. // 處理真正的駝峰片段
  86. if(result.length()==0){
  87. // 第一個駝峰片段,全部字母都小寫
  88. result+=camel.toLowerCase();
  89. }else{
  90. // 其他的駝峰片段,首字母大寫
  91. result+=camel.substring(0,1).toUpperCase();
  92. result+=camel.substring(1).toLowerCase();
  93. }
  94. }
  95. return result;
  96. }
  97. publicstaticString camelNamesb(String name){
  98. StringBuilder sb =newStringBuilder();
  99. // 快速檢查
  100. if(name ==null|| name.isEmpty()){
  101. // 沒必要轉換
  102. return"";
  103. }elseif(!name.contains("_")){
  104. // 不含下劃線,僅將首字母小寫
  105. return name.substring(0,1).toLowerCase()+ name.substring(1);
  106. }
  107. // 用下劃線將原始字串分割
  108. String camels[]= name.split("_");
  109. for(String camel : camels){
  110. // 跳過原始字串中開頭、結尾的下換線或雙重下劃線
  111. if(camel.isEmpty()){
  112. continue;
  113. }
  114. // 處理真正的駝峰片段
  115. if(sb.length()==0){
  116. // 第一個駝峰片段,全部字母都小寫
  117. sb.append(camel.toLowerCase());
  118. }else{
  119. // 其他的駝峰片段,首字母大寫
  120. sb.append(camel.substring(0,1).toUpperCase());
  121. sb.append(camel.substring(1).toLowerCase());
  122. }
  123. }
  124. return sb.toString();
  125. }
  126. publicstaticString underscoreName(String name){
  127. StringBuilder result =newStringBuilder();
  128. if(name !=null&& name.length()>0){
  129. // 將第一個字元處理成大寫
  130. result.append(name.substring(0,1).toUpperCase());
  131. // 迴圈處理其餘字元
  132. for(int i =1; i < name.length(); i++){
  133. String s = name.substring(i, i +1);
  134. // 在大寫字母前新增下劃線
  135. if(s.equals(s.toUpperCase())&&!Character.isDigit(s.charAt(0))){
  136. result.append("_");
  137. }
  138. // 其他字元直接轉成大寫
  139. result.append(s.toUpperCase());
  140. }
  141. }
  142. return result.toString();
  143. }
  144. publicstaticString camelToUnderline(String param){
  145. if(param==null||"".equals(param.trim())){
  146. return"";
  147. }
  148. int len=param.length();
  149. StringBuilder sb=newStringBuilder(len);
  150. for(int i =0; i < len; i++){
  151. char c=param.charAt(i);
  152. if(Character.isUpperCase(c)){
  153. sb.append("_");
  154. sb.append(Character.toLowerCase(c));
  155. }else{
  156. sb.append(c);
  157. }
  158. }
  159. return sb.toString();
  160. }
  161. }
程式碼來自: