zoukankan      html  css  js  c++  java
  • 下划线转驼峰,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. }
    代码来自:




  • 相关阅读:
    jQuery实现“回到顶部”按钮功能
    围绕DOM元素节点的增删改查
    jQuery ajax
    对JSON的理解
    Replacing Accented characters(Diacritic) .NET
    全球主要城市经纬度api
    无标题
    Use Razor for Email Template outside ASP.NET MVC
    .NET and php
    knockoutjs
  • 原文地址:https://www.cnblogs.com/opensesame/p/6098907.html
Copyright © 2011-2022 走看看