代码之家  ›  专栏  ›  技术社区  ›  Andy

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

  •  84
  • Andy  · 技术社区  · 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);
    

    我相信还有很多其他的方法可以达到这个目的。你推荐什么?

    11 回复  |  直到 9 年前
        1
  •  115
  •   Abdelilah El Aissaoui mario romano lopez    5 年前

    我用 JMH . 全面基准 code .

    结果

    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

      string = Character.toLowerCase(string.charAt(0)) + string.substring(1);
      
    2. test2 是安迪的第二次接近。它也是 Introspector.decapitalize() 丹尼尔建议,但没有两个 if 声明。弗斯特 因为测试假设而被删除。第二个被删除,因为它违反了正确性(即输入 "HI" “嗨” ). 这几乎是最快的。

      char c[] = string.toCharArray();
      c[0] = Character.toLowerCase(c[0]);
      string = new String(c);
      
    3. test3 是对 ,但不是 Character.toLowerCase() ,我添加了32,只有当字符串是ASCII时,它才能正常工作。这是最快的。 c[0] |= ' ' comment 也有同样的表现。

      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[] 直接成串。这是最慢的。

      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,请使用 测试2 .

    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格式的,并且您正在寻找极端的性能,因为您发现此代码处于瓶颈中,请使用 测试3

        2
  •  93
  •   Daniel Pacak    12 年前

    如果你不想使用第三方库,我找到了一个不错的选择:

    import java.beans.Introspector;
    
    Assert.assertEquals("someInputString", Introspector.decapitalize("SomeInputString"));
    
        3
  •  20
  •   Adam Stelmaszczyk    10 年前

    当涉及到字符串操作时,可以看看Jakarta Commons Lang StringUtils .

        4
  •  15
  •   Sebastian    11 年前

    如果要使用Apache Commons,可以执行以下操作:

    import org.apache.commons.lang3.text.WordUtils;
    [...] 
    String s = "SomeString"; 
    String firstLower = WordUtils.uncapitalize(s);
    

        5
  •  10
  •   Michael Konietzka    14 年前

    尽管采用了面向字符的方法,我还是建议采用面向字符串的解决方案。 String.toLowerCase 是特定于区域设置的,因此我将考虑此问题。 String.toLowerCase 更喜欢根据 Character.toLowerCase 另外,面向字符的解决方案与unicode不完全兼容,因为 字符.toLowerCase

    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")));
    

    将输出两个不同的结果:

        6
  •  7
  •   Alan Geleynse buhbang    14 年前

    Java中的字符串是不可变的,因此无论哪种方式都将创建一个新字符串。

        7
  •  3
  •   Adam Stelmaszczyk    10 年前

    一个非常简单的静态方法来存档您想要的内容:

    public static String decapitalizeString(String string) {
        return string == null || string.isEmpty() ? "" : Character.toLowerCase(string.charAt(0)) + string.substring(1);
    }
    
        8
  •  2
  •   Peter Lamberg qed    11 年前

    如果您需要的是非常简单的(例如java类名,没有locale),您还可以使用 CaseFormat Google Guava 图书馆。

    String converted = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, "FooBar");
    assertEquals("fooBar", converted);
    

    Converter<String, String> converter=
        CaseFormat.UPPER_CAMEL.converterTo(CaseFormat.LOWER_CAMEL);
    
    assertEquals("fooBar", converter.convert("FooBar"));
    

    为了更好地理解Google番石榴字符串操作的原理,请查看 this wiki page .

        9
  •  1
  •   Bae Cheol Shin    10 年前
    String testString = "SomeInputString";
    String firstLetter = testString.substring(0,1).toLowerCase();
    String restLetters = testString.substring(1);
    String resultString = firstLetter + restLetters;
    
        10
  •  1
  •   user3501758    10 年前

    我是今天才来的。试着用最平庸的方式自己做。那是一句台词,托隆吉希。来了

    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之后

        11
  •  1
  •   Vivek    6 年前
    val str = "Hello"
    s"${str.head.toLower}${str.tail}"
    

    结果:

    res4: String = hello