Java 使字符串的第一个字符小写的最有效方法是什么?
使Java 使字符串的第一个字符小写的最有效方法是什么?,java,string,performance,optimization,Java,String,Performance,Optimization,使字符串的第一个字符小写的最有效方法是什么 我可以想出很多方法来做到这一点: 使用charAt()和substring() String input = "SomeInputString"; String output = Character.toLowerCase(input.charAt(0)) + (input.length() > 1 ? input.substring(1) : ""); String input = "SomeI
字符串的第一个字符
小写的最有效方法是什么
我可以想出很多方法来做到这一点:
使用charAt()
和substring()
String input = "SomeInputString";
String output = Character.toLowerCase(input.charAt(0)) +
(input.length() > 1 ? input.substring(1) : "");
String input = "SomeInputString";
char c[] = input.toCharArray();
c[0] = Character.toLowerCase(c[0]);
String output = new String(c);
或使用字符
数组
我相信还有很多其他的好方法来实现这一点。您有什么建议?Java中的字符串是不可变的,因此无论哪种方式都会创建一个新字符串
您的第一个示例可能会稍微高效一些,因为它只需要创建一个新字符串,而不需要创建一个临时字符数组。当涉及到字符串操作时,请看一下Jakarta Commons Lang。尽管采用了面向字符的方法,我还是建议使用面向字符串的解决方案。 是特定于语言环境的,所以我会考虑这个问题
String.toLowerCase
更适合根据需要使用小写。
此外,面向字符的解决方案不完全兼容unicode,因为无法处理补充字符
public static final String uncapitalize(final String originalStr,
final Locale locale) {
final int splitIndex = 1;
final String result;
if (originalStr.isEmpty()) {
result = originalStr;
} else {
final String first = originalStr.substring(0, splitIndex).toLowerCase(
locale);
final String rest = originalStr.substring(splitIndex);
final StringBuilder uncapStr = new StringBuilder(first).append(rest);
result = uncapStr.toString();
}
return result;
}
更新:
举个例子,让我们用土耳其语和德语将locale设置设为小写的I
:
System.out.println(uncapitalize("I", new Locale("TR","tr")));
System.out.println(uncapitalize("I", new Locale("DE","de")));
将输出两个不同的结果:
ı
我
如果您不想使用第三方库,我发现了一个不错的选择:
import java.beans.Introspector;
Assert.assertEquals("someInputString", Introspector.decapitalize("SomeInputString"));
如果您需要的是非常简单的(例如java类名,没有区域设置),那么您也可以使用库中的类 或者,您可以准备并重用转换器对象,这可能会更有效
Converter<String, String> converter=
CaseFormat.UPPER_CAMEL.converterTo(CaseFormat.LOWER_CAMEL);
assertEquals("fooBar", converter.convert("FooBar"));
转换器=
CaseFormat.UPPER\u CAMEL.converterTo(CaseFormat.LOWER\u CAMEL);
assertEquals(“fooBar”,converter.convert(“fooBar”);
要更好地理解Google Guava字符串操作的原理,请查看。如果您想使用Apache Commons,可以执行以下操作:
import org.apache.commons.lang3.text.WordUtils;
[...]
String s = "SomeString";
String firstLower = WordUtils.uncapitalize(s);
结果:今天我才遇到了这个问题。我试着用最普通的方式自己做。那只花了一行,虽然很长。开始
String testString = "SomeInputString";
String firstLetter = testString.substring(0,1).toLowerCase();
String restLetters = testString.substring(1);
String resultString = firstLetter + restLetters;
String str = "TaxoRank";
System.out.println(" Before str = " + str);
str = str.replaceFirst(str.substring(0,1), str.substring(0,1).toLowerCase());
System.out.println(" After str = " + str);
给出:
str=TaxoRanks之前
str=taxoRanks之后一个非常简短、简单的静态方法来归档您想要的内容:
public static String decapitalizeString(String string) {
return string == null || string.isEmpty() ? "" : Character.toLowerCase(string.charAt(0)) + string.substring(1);
}
我使用测试了有希望的方法。完整基准 测试期间的假设(以避免每次检查拐角情况):输入字符串长度始终大于1 结果 分数是每秒的运算次数,越多越好 测验
test1
是Andy和Hllink的第一个方法:
string = Character.toLowerCase(string.charAt(0)) + string.substring(1);
test2
是安迪的第二个方法。它也是由Daniel建议的,但没有两个if
语句。如果由于测试假设而删除了第一个。第二个已被删除,因为它违反了正确性(即输入“HI”
将返回“HI”
)。这几乎是最快的
char c[] = string.toCharArray();
c[0] = Character.toLowerCase(c[0]);
string = new String(c);
test3
是对test2
的修改,但我添加了32,而不是Character.toLowerCase()
,当且仅当字符串为ASCII时,它才能正常工作。这是最快的<迈克的代码>c[0]|=''也有同样的表现
char c[] = string.toCharArray();
c[0] += 32;
string = new String(c);
test4
已使用StringBuilder
StringBuilder sb = new StringBuilder(string);
sb.setCharAt(0, Character.toLowerCase(sb.charAt(0)));
string = sb.toString();
test5
使用了两个substring()
调用
string = string.substring(0, 1).toLowerCase() + string.substring(1);
test6
使用反射直接在字符串中进行更改。这是最慢的
try {
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] value = (char[]) field.get(string);
value[0] = Character.toLowerCase(value[0]);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
test2
如果没有,我们必须检查拐角处的情况:
public static String decapitalize(String string) {
if (string == null || string.length() == 0) {
return string;
}
char c[] = string.toCharArray();
c[0] = Character.toLowerCase(c[0]);
return new String(c);
}
如果您确信您的文本将始终以ASCII格式显示,并且因为您在瓶颈中发现了这段代码而希望获得最佳性能,请使用test3
val str = "Hello"
s"${str.head.toLower}${str.tail}"
结果:
res4: String = hello
更具体地说,使用StringUtils的方法uncapitalize(java.lang.String)还有一个额外的优点,即不必担心代码中的NullPointerException。这不一定是最有效的,但可能是最清晰的,这很重要。这取决于您正在提高效率的资源(CPU或程序员时间:)如果可能,最好的方法是更改您的需求。接受StringBuilder而不是字符串,您可以直接修改它。这不是答案,因为它在Java之外,依赖于ASCII编码,并且知道字符已经是字母。这是老一套的老一套:
c[0]|=''代码>可能重复这是一个不同的问题事实上,第一种方法创建一个临时字符串(用于子字符串),比字符数组更昂贵。如果不支持此方法的文档数据,则没有帮助:“这通常意味着将第一个字符从大写转换为小写,但是(不常见)特殊情况当有多个字符,并且第一个和第二个字符都是大写时,我们就不用管它了。”另外,看看源代码,一旦这个方法处理了我在前面的评论中描述的特殊情况,它就只使用我在问题中提到的字符数组。这正是我所需要的。内省者。斩首(“ABC”)仍然是ABC。uncapitalize(“ABC”)产生“ABC”。只是分享前者是spring对bean进行自动命名的方式,因此如果您需要通过bean名称检索ABCService,它不是ABCService,但仍然是ABCService。这是一个很好且干净的解决方案,但现在已被弃用,我们应该使用commons文本的:编译组:'org.apache.commons',名称:'commons text',版本:'1.2'
val str = "Hello"
s"${str.head.toLower}${str.tail}"
res4: String = hello