下划线转驼峰,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家庭版。
代码如下:实践证明这种小功能测效率纯粹是闲的蛋疼……
package json.util;import java.util.Arrays;import java.util.regex.Matcher;import java.util.regex.Pattern;/*** Created by tm on 2016/11/24.* time : 15:45* project_name : code*/public class UnderLineString2Camel {/*** 下划线转驼峰* @param underline* @return*/public static String underline2Camel(String underline){Pattern pattern = Pattern.compile("[_]\\w");String camel = underline.toLowerCase();Matcher matcher = pattern.matcher(camel);while(matcher.find()){String w = matcher.group().trim();camel = camel.replace(w,w.toUpperCase().replace("_", ""));}return camel;}/*** 驼峰转下划线* @param camel* @return*/public static String Camel2Underline(String camel){Pattern pattern = Pattern.compile("[A-Z]");Matcher matcher = pattern.matcher(camel);while(matcher.find()){String w = matcher.group().trim();camel = camel.replace(w,"_"+w);}return camel.toUpperCase();}/*** 驼峰转下划线。* @param camel* @return*/public static String Camel2Underline2(String camel){char[] chars = camel.toCharArray();StringBuilder sb = new StringBuilder();for(int i=0,j=0;i<chars.length;i++,j++){char s = chars[i];if(s+1>65 && s+1<91){char _ = 95;sb.append(_);j++;sb.append(s);continue;}sb.append(s);}return sb.toString().toUpperCase();}public static void main(String[] args) {for (int i = 0;i<10;i++) {long start = System.nanoTime();camelNamesb("QW_ABD_XYZN");System.out.println(System.nanoTime() - start);}}public static String camelName(String name) {String result = "";// 快速检查if (name == null || name.isEmpty()) {// 没必要转换return "";} else if (!name.contains("_")) {// 不含下划线,仅将首字母小写return name.substring(0, 1).toLowerCase() + name.substring(1);}// 用下划线将原始字符串分割String camels[] = name.split("_");for (String camel : camels) {// 跳过原始字符串中开头、结尾的下换线或双重下划线if (camel.isEmpty()) {continue;}// 处理真正的驼峰片段if (result.length() == 0) {// 第一个驼峰片段,全部字母都小写result+=camel.toLowerCase();} else {// 其他的驼峰片段,首字母大写result+=camel.substring(0, 1).toUpperCase();result+=camel.substring(1).toLowerCase();}}return result;}public static String camelNamesb(String name) {StringBuilder sb = new StringBuilder();// 快速检查if (name == null || name.isEmpty()) {// 没必要转换return "";} else if (!name.contains("_")) {// 不含下划线,仅将首字母小写return name.substring(0, 1).toLowerCase() + name.substring(1);}// 用下划线将原始字符串分割String camels[] = name.split("_");for (String camel : camels) {// 跳过原始字符串中开头、结尾的下换线或双重下划线if (camel.isEmpty()) {continue;}// 处理真正的驼峰片段if (sb.length() == 0) {// 第一个驼峰片段,全部字母都小写sb.append(camel.toLowerCase());} else {// 其他的驼峰片段,首字母大写sb.append(camel.substring(0, 1).toUpperCase());sb.append(camel.substring(1).toLowerCase());}}return sb.toString();}public static String underscoreName(String name) {StringBuilder result = new StringBuilder();if (name != null && name.length() > 0) {// 将第一个字符处理成大写result.append(name.substring(0, 1).toUpperCase());// 循环处理其余字符for (int i = 1; i < name.length(); i++) {String s = name.substring(i, i + 1);// 在大写字母前添加下划线if (s.equals(s.toUpperCase()) && !Character.isDigit(s.charAt(0))) {result.append("_");}// 其他字符直接转成大写result.append(s.toUpperCase());}}return result.toString();}public static String camelToUnderline(String param){if (param==null||"".equals(param.trim())){return "";}int len=param.length();StringBuilder sb=new StringBuilder(len);for (int i = 0; i < len; i++) {char c=param.charAt(i);if (Character.isUpperCase(c)){sb.append("_");sb.append(Character.toLowerCase(c));}else{sb.append(c);}}return sb.toString();}}
代码来自:

浙公网安备 33010602011771号