1. ホーム
  2. java

長さ1の文字列として返された文字列から、Javaで最初の文字を取得する最も良い方法は何ですか?

2023-10-16 10:07:18

質問

次のように仮定する。

String example      = "something";
String firstLetter  = "";

以下のような割り当て方法で、注意すべき違いはありますか? firstLetter の割り当て方法で、パフォーマンスに影響を与える可能性があるものはありますか? どの方法が一番良いでしょうか、またその理由は?

firstLetter = String.valueOf(example.charAt(0));
firstLetter = Character.toString(example.charAt(0));
firstLetter = example.substring(0, 1);

として返されるのは、最初の文字が String として返されるのは、これが Hadoop で実行されているためで、文字列は Text の型になります。 firstLetter として出力されます。 key から map() というメソッドを使うことができます。

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

どのように解決するのですか?

性能面 substring(0, 1) の方が良いことがわかりました。

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

出力します。

String.valueOf: 38553
Character.toString: 30451
substring: 8660