public class Test1 { /** * @param args */ public static void main(String[] args) { long start = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { String aa = i + ""; } System.out.println( System.currentTimeMillis() - start); long start1 = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { String aa = String.valueOf(i); } System.out.print( System.currentTimeMillis() - start1); } }结果 ---------------------------------------------------------------------------------- 188 78
* @param args
*/
public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
String aa = i + "";
}
System.out.println( System.currentTimeMillis() - start);
long start1 = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
String aa = String.valueOf(i);
}
System.out.print( System.currentTimeMillis() - start1);
}
}结果
----------------------------------------------------------------------------------
188
78
操作 代码 耗时(单位时间)
本地赋值 i=n; 1.0
实例赋值 this.i=n; 1.2
int增值 i++; 1.5
byte增值 b++; 2.0
short增值 s++; 2.0
float增值 f++; 2.0
double增值 d++; 2.0
空循环 while(true) n++; 2.0
三元表达式 (x<0) ?-x : x 2.2
算术调用 Math.abs(x); 2.5
数组赋值 a[0] = n; 2.7
long增值 l++; 3.5
方法调用 funct(); 5.9
throw或catch异常 try{ throw e; }或catch(e){} 320
同步方法调用 synchMehod(); 570
新建对象 new Object(); 980
新建数组 new int[10]; 3100-------------------------------------------------
结论 1231231 + "" 创建了多个对象 ,造成了速度降低
+1
字符串相加很低效,如果次数不多无所谓,大量相加的话,还是用StringBuilder的append
LZ如果只想转为字符串,还是用String.valueOf好
String是final类,不可继承不可改变,在拼接的时候要转换成StringBuffer,再调用append,拼接完成后调用toString方法再转成String.
所以用加号和String.valueOf都不是好方法.
效率比较高的是StringBuffer和StringBuilder.推荐StringBuilder,这个类内部封装了StringBuffer,效率更高.你可以去JE找找,我记得以前有一个帖子专门测试这String,StringBuffer,StringBuilder三个拼接字符串的性能.
public static void main(String[] args) throws Exception {
new Thread() {
public void run() {
int i = 1000;
long s = System.currentTimeMillis();
for (int j = 0; j < 1000000; j++) {
String k = i + "";
}
System.out.println("字符串相加用了:" + (System.currentTimeMillis() - s) + "ms");
};
}.start(); new Thread() {
public void run() {
int i = 1000;
long s1 = System.currentTimeMillis();
for (int j = 0; j < 1000000; j++) {
String k = String.valueOf(i);
}
System.out.println("valueOf用了:" + (System.currentTimeMillis() - s1) + "ms");
};
}.start();
}valueOf用了:63ms
字符串相加用了:141ms
public class StrTest{
public void f1(){
String str = 1233434+"";
}
public void f2(){
String str =String.valueOf(456231);
}
public static void main(String args[]){
}
}
字节码:
public void f1();
Code:
Stack=1, Locals=2, Args_size=1
0: ldc #2; //String 1233434<----编译器在这里已经进行优化了,根本就不存在什么StringBuffer又StringBuilder之类的拼接,
2: astore_1
3: return
LineNumberTable:
line 3: 0
line 4: 3
public void f2();
Code:
Stack=1, Locals=2, Args_size=1
0: ldc #3; //int 456231
2: invokestatic #4; //Method java/lang/String.valueOf:(I)Ljava/lang/String;<-----这里还需要进行方法调用,谁的效率高难道还看不出来吗?
5: astore_1
6: return
LineNumberTable:
line 6: 0
line 7: 6
1233434+""比String.valueOf(1233434)效率要高
因为整数是常量,1233434+""也是个字符串常量,编译器已经优化了,而valueOf()要临时调用没法优化2)对于数字变量
int x;
x+"" 没有 String.valueOf(x)高
因为前者要创建3个字符串对象x,"",x+"",后者只需要创建1个对象
1233434+"",实际上是通过建立stringbuilder来实现的,可以反汇编。javap查看。