驼峰转下划线

  1. Ascii码依次比较法(Fastjson内部实现)
 private String underline(String name) {
        StringBuilder buf = new StringBuilder();
        for (int i = 0; i < name.length(); ++i) {
            char ch = name.charAt(i);
            if (ch >= 'A' && ch <= 'Z') {
                char ch_ucase = (char) (ch + 32);
                if (i > 0) {
                    buf.append('_');
                }
                buf.append(ch_ucase);
            } else {
                buf.append(ch);
            }
        }
        return buf.toString();
    }
  1. guava 内部实现
<dependency>
	<groupId>com.google.guava</groupId>
	<artifactId>guava</artifactId>
	<version>30.0-jre</version>
</dependency>
 System.out.println(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "HelloWord");)
  1. 正则匹配替换
/**
 * 将驼峰格式字符串转下划线格式
 * @param str string 待处理字符串
 * @return string 处理结果
 */
public static String underline(String str) {
        //正则匹配大写字符转成小写并在前面加上下划线
        Matcher matcher = AZ_PATTERN.matcher(str);
        StringBuffer sb = new StringBuffer(str);
        if (matcher.find()) {
            sb = new StringBuffer();
            //将当前匹配的子串替换成指定字符串,并且将替换后的子串及之前到上次匹配的子串之后的字符串添加到StringBuffer对象中
            //正则之前的字符和被替换的字符
            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
            //把之后的字符串也添加到StringBuffer对象中
            matcher.appendTail(sb);
        } else {
            return sb.toString();
        }
        return underline(sb.toString());
    }

速度总结

速度 1(ascii依次比较) > 2 (guava) > 3(正则),后续使用方式一

下划线转驼峰

  1. Ascii码依次比较法
private static String camel(String word) {
        if (word == null) {
            return null;
        }
        String[] split = word.split("_");
        StringBuffer sb = new StringBuffer(word.length());
        for (String s : split) {
            char[] chars = s.toCharArray();
            if(chars[0] >= 'A' && chars[0] <='Z'){
    
            }else if(chars[0] >='a' && chars[0] <= 'z'){
                chars[0] -=32;
            }
    
            sb.append(chars);
        }
        return sb.toString();
    }
  1. guava 内部实现
 System.out.println(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "hello_word");)
  1. 正则匹配替换

private static Pattern AZ_PATTERN = Pattern.compile("[A-Z]");
	/**
     * 将下划线格式字符串转驼峰格式
     * @param str string 待处理字符串
     * @return string 处理结果
     */
    public static String camel(String str) {
        //正则匹配下划线及后一个字符,删除下划线并将匹配的字符转成大写
        Matcher matcher = UNDERLINE_PATTERN.matcher(str);
        StringBuffer sb = new StringBuffer(str);
        if (matcher.find()) {
            sb = new StringBuffer();
            //将当前匹配的子串替换成指定字符串,并且将替换后的子串及之前到上次匹配的子串之后的字符串添加到StringBuffer对象中
            //正则之前的字符和被替换的字符
            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
            //把之后的字符串也添加到StringBuffer对象中
            matcher.appendTail(sb);
        } else {
            return sb.toString();
        }
        return camel(sb.toString());
    }

速度总结

速度 1(ascii依次比较法) > 2 (guava) > 3(正则),后续使用方式一
guava方式比ascii方式速度慢点有限

Q.E.D.


寻门而入,破门而出