字符串首字母由大写改小写简单方法以及一些思考归纳

举报
六月暴雪飞梨花 发表于 2022/09/18 19:30:00 2022/09/18
【摘要】 字符串首字母由大写改小写。 首先,这得是一个字符串,其次,他得有能力被改写为小写字母。当然这之前的一些判定需要自行处理。 String的中文含义是:一串;线;细绳;带子;一系列;一连串;一批;字符串;弦等。

字符串首字母由大写改小写


首先,这得是一个字符串,其次,他得有能力被改写为小写字母。当然这之前的一些判定需要自行处理。


应用场景

  • Spring在代码中获取bean时使用类名称的类名首字母小写格式
  • 我们自定义Bean时,获取Bean的方式
  • 汉字转为拼音时,首字母需要大写


String的中文含义是:一串;线;细绳;带子;一系列;一连串;一批;字符串;弦等。我搜罗了下,发现了以下几种工具方案:


方案工具

1、自己编写一个工具类

暂且,我们把自己编写的工具类叫做StringUtils

当我们站在巨人的肩膀上时,发现一切都是理所当然,一切都是随意而且简单。当我们自己去梳理思路时,却还是一步一个脚印的造轮子。

public static String toLowerCaseFirstOne(String str) {
    if (Character.isLowerCase(str.charAt(0))) {
        return str;
    } else {
        return (new StringBuilder()).append(Character.toLowerCase(str.charAt(0))).append(str.substring(1)).toString();
    }
}


这的确是一个锻炼人的方案,可以给予程序员一个思考的空间。我Baidu了一下,这种代码编写方案在自定义工具类StringUtils的比较多,相对应的还有首字母改为大写


初学者可能还会截取第一个字符,然后转为小写,再拼接起来成为一个完整的字符串,这也不失为一种解决方案,我们也姑且放在SrtringUtils工具类里面。

public static String toLowerCaseFirstOne(String word) {
    if (StringUtils.isEmpty(word)) {
        return null;
    } else {
        return word.substring(0, 1).toUpperCase() + word.substring(1);
    }
}


2、使用Hutool工具类

Hutool工具类的StrUtil

Hutool这个是一个很好的工具,在项目中也很常使用,因为这些都是一些大佬给予我们的财富,给予我们的一些已经创造好的财富,我们只需要取就可以了。

public static String lowerFirst(CharSequence str) {
   if (null == str) {
      return null;
   }
   if (str.length() > 0) {
      char firstChar = str.charAt(0);
      if (Character.isUpperCase(firstChar)) {
         return Character.toLowerCase(firstChar) + subSuf(str, 1);
      }
   }
   return str.toString();
}


3、使用Commons Lang

Commons Lang下commons-lang下的WordUtils

国外比较常用,国内一般般。但是一些工具还是会使用。

public static String uncapitalize(String str) {
    return uncapitalize(str, null);
}
public static String uncapitalize(String str, char[] delimiters) {
    int delimLen = (delimiters == null ? -1 : delimiters.length);
    if (str == null || str.length() == 0 || delimLen == 0) {
        return str;
    }
    int strLen = str.length();
    StringBuffer buffer = new StringBuffer(strLen);
    boolean uncapitalizeNext = true;
    for (int i = 0; i < strLen; i++) {
        char ch = str.charAt(i);
        if (isDelimiter(ch, delimiters)) {
            buffer.append(ch);
            uncapitalizeNext = true;
        } else if (uncapitalizeNext) {
            buffer.append(Character.toLowerCase(ch));
            uncapitalizeNext = false;
        } else {
            buffer.append(ch);
        }
    }
    return buffer.toString();
}


4、使用Apache Commons Lang

Apache Commons Lang下commons-text下的WordUtils

可以说是一个老牌子的工具类。

public static String uncapitalize(final String str) {
    return uncapitalize(str, null);
}
public static String uncapitalize(final String str, final char... delimiters) {
    if (StringUtils.isEmpty(str)) {
        return str;
    }
    final Set<Integer> delimiterSet = generateDelimiterSet(delimiters);
    final int strLen = str.length();
    final int[] newCodePoints = new int[strLen];
    int outOffset = 0;
    boolean uncapitalizeNext = true;
    for (int index = 0; index < strLen;) {
        final int codePoint = str.codePointAt(index);
        if (delimiterSet.contains(codePoint)) {
            uncapitalizeNext = true;
            newCodePoints[outOffset++] = codePoint;
            index += Character.charCount(codePoint);
        } else if (uncapitalizeNext) {
            final int titleCaseCodePoint = Character.toLowerCase(codePoint);
            newCodePoints[outOffset++] = titleCaseCodePoint;
            index += Character.charCount(titleCaseCodePoint);
            uncapitalizeNext = false;
        } else {
            newCodePoints[outOffset++] = codePoint;
            index += Character.charCount(codePoint);
        }
    }
    return new String(newCodePoints, 0, outOffset);
}


可以参考官方提供的文档:[commons-text]


5、使用Apache Commons Lang

Apache Commons Lang下commons-lang3下的WordUtils

这是老牌子的一个升级款,建议使用这个。

public static String uncapitalize(final String str) {
    return uncapitalize(str, null);
}
public static String uncapitalize(final String str, final char... delimiters) {
    final int delimLen = delimiters == null ? -1 : delimiters.length;
    if (StringUtils.isEmpty(str) || delimLen == 0) {
        return str;
    }
    final char[] buffer = str.toCharArray();
    boolean uncapitalizeNext = true;
    for (int i = 0; i < buffer.length; i++) {
        final char ch = buffer[i];
        if (isDelimiter(ch, delimiters)) {
            uncapitalizeNext = true;
        } else if (uncapitalizeNext) {
            buffer[i] = Character.toLowerCase(ch);
            uncapitalizeNext = false;
        }
    }
    return new String(buffer);
}


备注:当前commons-lang3下的WordUtils的类已经不再支持使用,建议使用第4种方案commons-text下的WordUtils 。


关于方法的思考

我打算做一个简单的实验设计下哪一种方案在执行过程中处理时间比较少。找三组数据:

  • WordUtils
  • WordUtilsWordUtilsWordUtilsWordUtils
  • WordUtilsWordUtilsWordUtilsWordUtilsWordUtilsWordUtilsWordUtilsWordUtils


分别使用上述方案执行,然后记录下Main方法执行的时间。经过自己机器处理分别得出下面的几组实验数据(执行时间,单位毫秒):

image.png

上面得到的数据差别不是很大,至于选择哪一种方案,自己甄别下。


执行实验设计的Main方法:

public static void main(String[] args) {
    long startTime = System.currentTimeMillis();
    System.out.println(StringUtil.toLowerCaseFirstOne("WordUtils"));
    long endTime = System.currentTimeMillis();
    System.out.println(String.format("开始时间:%s 结束时间:%s 相差时间:%s", startTime, endTime, endTime - startTime));
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。