假设如下:
String example = "something";
String firstLetter = "";
Run Code Online (Sandbox Code Playgroud)
是否存在差异,需要注意以下firstLetter
可能影响绩效的分配方式; 哪个最好,为什么?
firstLetter = String.valueOf(example.charAt(0));
firstLetter = Character.toString(example.charAt(0));
firstLetter = example.substring(0, 1);
Run Code Online (Sandbox Code Playgroud)
第一个字母作为a返回的原因String
是它在Hadoop中运行,并且需要分配给Text
类型的字符串,firstLetter
将作为a 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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ank*_*thi 107
性能明智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));
Run Code Online (Sandbox Code Playgroud)
输出:
String.valueOf: 38553
Character.toString: 30451
substring: 8660
Run Code Online (Sandbox Code Playgroud)
ysh*_*vit 13
长话短说,这可能没关系.使用您认为最好的选择.
更长的答案,特别是使用Oracle的Java 7 JDK,因为这不是在JLS中定义的:
String.valueOf
或Character.toString
以相同的方式工作,所以使用你觉得好看的任何一个.实际上,Character.toString
只需调用String.valueOf
(源).
所以问题是,你应该使用其中之一还是String.substring
.这里再次没关系.String.substring
使用原始字符串char[]
,因此分配一个少于的对象String.valueOf
.这也可以防止原始字符串被GC控制,直到单字符字符串可用于GC(可能是内存泄漏),但在您的示例中,它们在每次迭代后都可用于GC,因此不会没关系 您保存的分配也无关紧要 - char[1]
分配起来很便宜,而短期对象(因为单字符串将是)也很便宜.
如果你有足够大的数据集,三者甚至可以测量,substring
可能会略有优势.就像,非常轻微.但是"如果......可衡量的"包含了这个答案的真正关键:你为什么不试试这三个并测量哪一个最快?
小智 6
String whole = "something";
String first = whole.substring(0, 1);
System.out.println(first);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
233648 次 |
最近记录: |