假设如下所示:
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);
}
}
}
}
发布于 2013-08-13 14:46:56
性能明智的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
发布于 2013-08-13 13:54:38
长话短说,这可能无关紧要。使用你认为看起来最好的。
更长的答案,特别是使用Oracle的Java 7 JDK,因为这没有在JLS中定义:
String.valueOf
或Character.toString
的工作方式相同,所以请使用您觉得更好看的。实际上,Character.toString
只是调用String.valueOf
(source)。
所以问题是,你应该使用其中的一个还是String.substring
。在这里,这也无关紧要。String.substring
使用原始字符串的char[]
,因此分配的对象比String.valueOf
少一个。这还可以防止原始字符串被GC,直到只有一个字符的字符串可供GC使用(这可能是内存泄漏),但在您的示例中,它们在每次迭代后都可用于GC,所以这并不重要。保存的分配也无关紧要-- char[1]
的分配成本很低,而使用寿命较短的对象(如单字符字符串)对于GC来说也很便宜。
如果你有一个足够大的数据集,这三个都是可测量的,substring
可能会给你一点优势。就像,非常轻微。但是“如果……可测量”包含了这个答案的真正关键:为什么你不尝试所有三个,并测量哪一个是最快的?
发布于 2017-07-05 02:53:05
String whole = "something";
String first = whole.substring(0, 1);
System.out.println(first);
https://stackoverflow.com/questions/18201191
复制相似问题