从Java中的string中获取第一个字母的最佳方法是什么?返回长度为1的string?

假设如下:

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

是否有差异要注意与以下方式分配可能影响性能的第一个firstLetter ; 这将是最好的,为什么?

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

第一个字母以Stringforms返回的原因是,这是在Hadoop中运行的,并且需要一个string来分配给Texttypes, firstLetter将从map()方法中作为key输出,例如:

 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 

长话短说,这可能没有关系。 使用你认为最好的一个。

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

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

所以问题是,如果你使用其中的一个或String.substring 。 这里再次没有什么关系。 String.substring使用原始string的char[] ,因此分配一个比String.valueOfless的对象。 这也可以防止原始string被GC'ed,直到一个字符的string可用于GC(这可能是一个内存泄漏),但在你的例子中,他们都会在每次迭代后可用于GC,以便不没关系。 你保存的分配也并不重要 – 一个char[1]分配起来很便宜,对于GC来说,短期的对象(就像一个string)对于GC来说也很便宜。

如果你有足够大的数据集,那么这三个数据甚至是可测量的, substring可能会略微优先。 像,真的很轻微。 但是,“如果……可衡量的”包含这个答案的真正的关键:为什么不尝试所有三个,并衡量哪一个最快?

 String whole = "something"; String first = whole.substring(0, 1); System.out.println(first); 
 import java.io.*; class Initials { public static void main(String args[])throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String s; char x; int l; System.out.print("Enter any sentence: "); s=br.readLine(); s = " " + s; //adding a space infront of the inputted sentence or a name s = s.toUpperCase(); //converting the sentence into Upper Case (Capital Letters) l = s.length(); //finding the length of the sentence</span> System.out.print("Output = "); for(int i=0;i<l;i++) { x = s.charAt(i); //taking out one character at a time from the sentence if(x == ' ') //if the character is a space, printing the next Character along with a fullstop System.out.print(s.charAt(i+1)+"."); } } }