当前位置: 首页 > 面试题库 >

使String的第一个字符小写的最有效方法?

云承天
2023-03-14
问题内容

使String小写的第一个字符最有效的方法是什么?

我可以想到许多方法来做到这一点:

使用charAt()substring()

String input   = "SomeInputString";
String output  = Character.toLowerCase(input.charAt(0)) +
                   (input.length() > 1 ? input.substring(1) : "");

或使用char数组

 String input  = "SomeInputString";
 char c[]      = input.toCharArray();
 c[0]          = Character.toLowerCase(c[0]);
 String output = new String(c);

我相信还有许多其他好的方法可以实现这一目标。您有什么推荐的吗?


问题答案:

我使用JMH测试了有前途的方法。完整的基准代码。

测试期间的假设(以避免每次都检查极端情况):输入的String长度始终大于1。

结果

Benchmark           Mode  Cnt         Score        Error  Units
MyBenchmark.test1  thrpt   20  10463220.493 ± 288805.068  ops/s
MyBenchmark.test2  thrpt   20  14730158.709 ± 530444.444  ops/s
MyBenchmark.test3  thrpt   20  16079551.751 ±  56884.357  ops/s
MyBenchmark.test4  thrpt   20   9762578.446 ± 584316.582  ops/s
MyBenchmark.test5  thrpt   20   6093216.066 ± 180062.872  ops/s
MyBenchmark.test6  thrpt   20   2104102.578 ±  18705.805  ops/s

分数是每秒的操作数,越高越好。

测验

  1. test1 首先是Andy和Hllink的方法:

    string = Character.toLowerCase(string.charAt(0)) + string.substring(1);
    
  2. test2是第二安迪的方法。Introspector.decapitalize()丹尼尔(Daniel )也提出了建议,但没有两个if陈述。if由于测试假设,第一个被删除。第二个被删除,因为它违反了正确性(即input "HI"返回"HI")。这几乎是最快的。

    char c[] = string.toCharArray();
    

    c[0] = Character.toLowerCase(c[0]);
    string = new String(c);

  3. test3是对的修改test2,但不是,而是Character.toLowerCase()添加了32,当且仅当字符串为ASCII时,该字体才能正常工作。这是最快的。c[0] |= ' '来自Mike的评论给出了相同的表现。

    char c[] = string.toCharArray();
    

    c[0] += 32;
    string = new String(c);

  4. test4用过的StringBuilder

    StringBuilder sb = new StringBuilder(string);
    

    sb.setCharAt(0, Character.toLowerCase(sb.charAt(0)));
    string = sb.toString();

  5. test5用了两个substring()电话。

    string = string.substring(0, 1).toLowerCase() + string.substring(1);
    
  6. test6使用反射char value[]直接在String中进行更改。这是最慢的。

    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



 类似资料:
  • 问题内容: 有一个大写字符串的函数,我希望能够更改字符串的第一个字符以确保它是小写的。 如何在Python中做到这一点? 问题答案: 一线处理空字符串和:

  • 本文向大家介绍写一个把字符串大小写切换的方法相关面试题,主要包含被问及写一个把字符串大小写切换的方法时的应答技巧和注意事项,需要的朋友参考一下 var reversal = function(str){ var newStr = ''; if(Object.prototype.toString.call(str).slice(8,-1) !== 'String'){ alert("请填写字符串")

  • 将一个字符串的第一个字母(大写字母)变成小写。 使用数组解构和 String.toLowerCase() 将第一个字母变成小写,...rest 是获取第一个字母之后字符数组,然后使用 Array.join('') 使其再次拼接成为字符串。 省略 upperRest 参数来保持字符串的其余部分不变,或者将其设置为 true 来将字符串的其余部分转换为大写。 const decapitalize =

  • 我希望有一个用于密码匹配的regex,以确保密码包含: null 其他一些问题可以解决一些明确字母的脓肿问题。正如您在我接受的答案中所看到的,regex与我想要的并不接近。

  • 问题内容: 好的,我确定它必须存在于此处的某个地方,但是我似乎找不到它。 是否存在,如果存在,则根据的最小(非空)序列? 我在猜测,但我不确定。 问题答案: 给定的实现(请参阅参考资料),您可以验证大小为0的字符串(因此为空字符串)将始终小于或等于任何其他非null字符串。(等于与空字符串比较)。

  • 我最近接受了一家社交媒体公司的面试,在那里我被问到了以下问题。 有k个长度为m的未排序数组。目标是在给定a 我提出了两个可能的解决方案: null 对于使用quickselect查找第b个最小元素的第一步,平均时间总共从O(km)到O(km*log(m))。第二步时间复杂度为O(km)。最后一步是在C中的第a和第b个最小元素之间寻找元素,取O((b-a)log(kb))。因此,total在时间上需