字符串首字母由大写改小写
首先,这得是一个字符串,其次,他得有能力被改写为小写字母。当然这之前的一些判定需要自行处理。
应用场景
- Spring在代码中获取bean时使用类名称的类名首字母小写格式
- 我们自定义Bean时,获取Bean的方式
- 汉字转为拼音时,首字母需要大写
String的中文含义是:一串;线;细绳;带子;一系列;一连串;一批;字符串;弦等。我搜罗了下,发现了以下几种工具方案:
方案工具
1、自己编写一个工具类
暂且,我们把自己编写的工具类叫做StringUtils
当我们站在巨人的肩膀上时,发现一切都是理所当然,一切都是随意而且简单。当我们自己去梳理思路时,却还是一步一个脚印的造轮子。
publicstaticStringtoLowerCaseFirstOne(Stringstr) { if (Character.isLowerCase(str.charAt(0))) { returnstr; } else { return (newStringBuilder()).append(Character.toLowerCase(str.charAt(0))).append(str.substring(1)).toString(); } }
这的确是一个锻炼人的方案,可以给予程序员一个思考的空间。我Baidu了一下,这种代码编写方案在自定义工具类StringUtils的比较多,相对应的还有首字母改为大写。
初学者可能还会截取第一个字符,然后转为小写,再拼接起来成为一个完整的字符串,这也不失为一种解决方案,我们也姑且放在SrtringUtils工具类里面。
publicstaticStringtoLowerCaseFirstOne(Stringword) { if (StringUtils.isEmpty(word)) { returnnull; } else { returnword.substring(0, 1).toUpperCase() +word.substring(1); } }
2、使用Hutool工具类
Hutool工具类的StrUtil
Hutool这个是一个很好的工具,在项目中也很常使用,因为这些都是一些大佬给予我们的财富,给予我们的一些已经创造好的财富,我们只需要取就可以了。
publicstaticStringlowerFirst(CharSequencestr) { if (null==str) { returnnull; } if (str.length() >0) { charfirstChar=str.charAt(0); if (Character.isUpperCase(firstChar)) { returnCharacter.toLowerCase(firstChar) +subSuf(str, 1); } } returnstr.toString(); }
3、使用Commons Lang
Commons Lang下commons-lang下的WordUtils
国外比较常用,国内一般般。但是一些工具还是会使用。
publicstaticStringuncapitalize(Stringstr) { returnuncapitalize(str, null); } publicstaticStringuncapitalize(Stringstr, char[] delimiters) { intdelimLen= (delimiters==null?-1 : delimiters.length); if (str==null||str.length() ==0||delimLen==0) { returnstr; } intstrLen=str.length(); StringBufferbuffer=newStringBuffer(strLen); booleanuncapitalizeNext=true; for (inti=0; i<strLen; i++) { charch=str.charAt(i); if (isDelimiter(ch, delimiters)) { buffer.append(ch); uncapitalizeNext=true; } elseif (uncapitalizeNext) { buffer.append(Character.toLowerCase(ch)); uncapitalizeNext=false; } else { buffer.append(ch); } } returnbuffer.toString(); }
4、使用Apache Commons Lang
Apache Commons Lang下commons-text下的WordUtils
可以说是一个老牌子的工具类。
publicstaticStringuncapitalize(finalStringstr) { returnuncapitalize(str, null); } publicstaticStringuncapitalize(finalStringstr, finalchar... delimiters) { if (StringUtils.isEmpty(str)) { returnstr; } finalSet<Integer>delimiterSet=generateDelimiterSet(delimiters); finalintstrLen=str.length(); finalint[] newCodePoints=newint[strLen]; intoutOffset=0; booleanuncapitalizeNext=true; for (intindex=0; index<strLen;) { finalintcodePoint=str.codePointAt(index); if (delimiterSet.contains(codePoint)) { uncapitalizeNext=true; newCodePoints[outOffset++] =codePoint; index+=Character.charCount(codePoint); } elseif (uncapitalizeNext) { finalinttitleCaseCodePoint=Character.toLowerCase(codePoint); newCodePoints[outOffset++] =titleCaseCodePoint; index+=Character.charCount(titleCaseCodePoint); uncapitalizeNext=false; } else { newCodePoints[outOffset++] =codePoint; index+=Character.charCount(codePoint); } } returnnewString(newCodePoints, 0, outOffset); }
可以参考官方提供的文档:[commons-text]
5、使用Apache Commons Lang
Apache Commons Lang下commons-lang3下的WordUtils
这是老牌子的一个升级款,建议使用这个。
publicstaticStringuncapitalize(finalStringstr) { returnuncapitalize(str, null); } publicstaticStringuncapitalize(finalStringstr, finalchar... delimiters) { finalintdelimLen=delimiters==null?-1 : delimiters.length; if (StringUtils.isEmpty(str) ||delimLen==0) { returnstr; } finalchar[] buffer=str.toCharArray(); booleanuncapitalizeNext=true; for (inti=0; i<buffer.length; i++) { finalcharch=buffer[i]; if (isDelimiter(ch, delimiters)) { uncapitalizeNext=true; } elseif (uncapitalizeNext) { buffer[i] =Character.toLowerCase(ch); uncapitalizeNext=false; } } returnnewString(buffer); }
备注:当前commons-lang3下的WordUtils的类已经不再支持使用,建议使用第4种方案commons-text下的WordUtils 。
关于方法的思考
我打算做一个简单的实验设计下哪一种方案在执行过程中处理时间比较少。找三组数据:
- WordUtils
- WordUtilsWordUtilsWordUtilsWordUtils
- WordUtilsWordUtilsWordUtilsWordUtilsWordUtilsWordUtilsWordUtilsWordUtils
分别使用上述方案执行,然后记录下Main方法执行的时间。经过自己机器处理分别得出下面的几组实验数据(执行时间,单位毫秒):
上面得到的数据差别不是很大,至于选择哪一种方案,自己甄别下。
执行实验设计的Main方法:
publicstaticvoidmain(String[] args) { longstartTime=System.currentTimeMillis(); System.out.println(StringUtil.toLowerCaseFirstOne("WordUtils")); longendTime=System.currentTimeMillis(); System.out.println(String.format("开始时间:%s 结束时间:%s 相差时间:%s", startTime, endTime, endTime-startTime)); }