Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使字符串的第一个字符小写的最有效方法是什么?_Java_String_Performance_Optimization - Fatal编程技术网

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();
    }
    
  • 结论 如果字符串长度始终大于0,请使用
    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