首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中,从字符串中获取第一个字母的最佳方法是什么,该字符串作为长度为1的字符串返回?

在Java中,从字符串中获取第一个字母的最佳方法是什么,该字符串作为长度为1的字符串返回?
EN

Stack Overflow用户
提问于 2013-08-13 13:16:02
回答 5查看 273.5K关注 0票数 74

假设如下所示:

代码语言:javascript
复制
String example      = "something";
String firstLetter  = "";

对于以下可能影响性能的firstLetter分配方式,是否存在需要注意的差异?哪种方式最好?为什么?

代码语言:javascript
复制
firstLetter = String.valueOf(example.charAt(0));
firstLetter = Character.toString(example.charAt(0));
firstLetter = example.substring(0, 1);

将第一个字母作为String返回的原因是,这是在Hadoop中运行的,并且需要将字符串分配给Text类型,因此firstLetter将作为keymap()方法输出,例如:

代码语言:javascript
复制
public class FirstLetterMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    String line = new String();
    Text firstLetter = new Text();
    IntWritable wordLength = new IntWritable();

    @Override
    public void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {

        line = value.toString();

        for (String word : line.split("\\W+")){
            if (word.length() > 0) {

                // ---------------------------------------------
                // firstLetter assignment
                firstLetter.set(String.valueOf(word.charAt(0)).toLowerCase());
                // ---------------------------------------------

                wordLength.set(word.length());
                context.write(firstLetter, wordLength);
            }
        }
  }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-08-13 14:46:56

性能明智的substring(0, 1)更好,如下所示:

代码语言:javascript
复制
    String example = "something";
    String firstLetter  = "";

    long l=System.nanoTime();
    firstLetter = String.valueOf(example.charAt(0));
    System.out.println("String.valueOf: "+ (System.nanoTime()-l));

    l=System.nanoTime();
    firstLetter = Character.toString(example.charAt(0));
    System.out.println("Character.toString: "+ (System.nanoTime()-l));

    l=System.nanoTime();
    firstLetter = example.substring(0, 1);
    System.out.println("substring: "+ (System.nanoTime()-l));

输出:

代码语言:javascript
复制
String.valueOf: 38553
Character.toString: 30451
substring: 8660
票数 118
EN

Stack Overflow用户

发布于 2013-08-13 13:54:38

长话短说,这可能无关紧要。使用你认为看起来最好的。

更长的答案,特别是使用Oracle的Java 7 JDK,因为这没有在JLS中定义:

String.valueOfCharacter.toString的工作方式相同,所以请使用您觉得更好看的。实际上,Character.toString只是调用String.valueOf (source)。

所以问题是,你应该使用其中的一个还是String.substring。在这里,这也无关紧要。String.substring使用原始字符串的char[],因此分配的对象比String.valueOf少一个。这还可以防止原始字符串被GC,直到只有一个字符的字符串可供GC使用(这可能是内存泄漏),但在您的示例中,它们在每次迭代后都可用于GC,所以这并不重要。保存的分配也无关紧要-- char[1]的分配成本很低,而使用寿命较短的对象(如单字符字符串)对于GC来说也很便宜。

如果你有一个足够大的数据集,这三个都是可测量的,substring可能会给你一点优势。就像,非常轻微。但是“如果……可测量”包含了这个答案的真正关键:为什么你不尝试所有三个,并测量哪一个是最快的?

票数 14
EN

Stack Overflow用户

发布于 2017-07-05 02:53:05

代码语言:javascript
复制
String whole = "something";
String first = whole.substring(0, 1);
System.out.println(first);
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18201191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档