从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);
第一个字母以String
forms返回的原因是,这是在Hadoop中运行的,并且需要一个string来分配给Text
types, 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.valueOf
或Character.toString
工作方式相同,所以使用你觉得看起来更好。 实际上, Character.toString
只是调用String.valueOf
( source )。
所以问题是,如果你使用其中的一个或String.substring
。 这里再次没有什么关系。 String.substring
使用原始string的char[]
,因此分配一个比String.valueOf
less的对象。 这也可以防止原始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)+"."); } } }