下划线转驼峰,3种实现方式效率对比

想做一个数据格式转换的工具,恰好遇到了要把数据库中下划线字段改成java中驼峰型字符串,所以就去网上找点资料,并自己写了实现。
一时兴起想要比较一下效率如何,也顺便贴上代码。
总体而言,无论是驼峰转下划线还是下划线转驼峰,一般而言都不会超过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. public class UnderLineString2Camel {
  11. /**
  12. * 下划线转驼峰
  13. * @param underline
  14. * @return
  15. */
  16. public static String 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. public static String Camel2Underline(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. public static String Camel2Underline2(String camel){
  46. char[] chars = camel.toCharArray();
  47. StringBuilder sb = new StringBuilder();
  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. public static void 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. public static String camelName(String name) {
  69. String result = "";
  70. // 快速检查
  71. if (name == null || name.isEmpty()) {
  72. // 没必要转换
  73. return "";
  74. } else if (!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. public static String camelNamesb(String name) {
  98. StringBuilder sb = new StringBuilder();
  99. // 快速检查
  100. if (name == null || name.isEmpty()) {
  101. // 没必要转换
  102. return "";
  103. } else if (!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. public static String underscoreName(String name) {
  127. StringBuilder result = new StringBuilder();
  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. public static String camelToUnderline(String param){
  145. if (param==null||"".equals(param.trim())){
  146. return "";
  147. }
  148. int len=param.length();
  149. StringBuilder sb=new StringBuilder(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. }
代码来自:




原文地址:https://www.cnblogs.com/opensesame/p/6098907.html