求解释for循环的问题举例1String str = "";
for(int i=0;i < 5;i++){
str = i+"";
//下面处理str其他操作
}
举例2for(int i=0;i < 5;i++){
String str = i+"";
//下面处理str其他操作
}
这两种定义方式,哪个会对系统开销大,哪个会快些,建议用哪个
原因是什么
我问过不少人,对各种说法不一,求真相当然这是个例子,真实的循环不止是<5的简单循环
for(int i=0;i < 5;i++){
str = i+"";
//下面处理str其他操作
}
举例2for(int i=0;i < 5;i++){
String str = i+"";
//下面处理str其他操作
}
这两种定义方式,哪个会对系统开销大,哪个会快些,建议用哪个
原因是什么
我问过不少人,对各种说法不一,求真相当然这是个例子,真实的循环不止是<5的简单循环
原因(摘自http://www.iteye.com/problems/74037)如下:
放在循环内部定义,确实会多次申请栈帧的内存空间(java中一个线程对应一个Java栈,每次方法调用会向栈中压入一个新帧,帧中存储着参数、局部变量、中间运算结果等等数据,方法调用结束后当前的帧就被弹出了,为什么会多占用栈空间内,原因很简单,每次循环都要重复定义局部变量,而如果放在循环体外,每次只要移动引用指向的堆内存地址即可,不必重新申请内存空间了。
public static void main(String[] args) {
System.out.println(timeCost(1));
System.out.println(timeCost(2));
} public static long timeCost(int i) {
long startTime = System.currentTimeMillis();
if (i == 1) {
test1();
}else {
test2();
}
long endTime = System.currentTimeMillis(); return endTime - startTime;
} public static void test1() {
String str = null;
for (int i = 0; i < 20000000; i+=2){
str = i + "";
}
} public static void test2() {
for (int i = 1; i < 20000000; i+=2) {
String str = i + "";
}
}
}
第一个会将生成的新对象赋值给str,而前一个生成的对象,没有明确抛弃,垃圾回收的时候也比较的耗时。
第二个局部对象将不做再赋值操作,切明确该块结束时,将进行垃圾回收,明确回收的对象,耗时较低。PS:在JAVA中,明确不再需要的值,赋值为null,速度的提升是比较明显的。
好吧,我错了,速度都差不多一样。
long t1 = System.nanoTime();
for(int i=0;i < 50000;i++){
String str01 = i+"";
//下面处理str其他操作
}
long t2 = System.nanoTime();
System.out.println(t2 - t1); long t3 = System.nanoTime();
String str = "";
for(int i=0;i < 50000;i++){
str = i+"";
//下面处理str其他操作
}
long t4 = System.nanoTime();
System.out.println(t4 - t3);总是前面的程序比后面的程序耗时..........
long endTime=System.currentTimeMillis();//结束
for(int i=0;i < 5;i++){
str = String.valueOf( i ) ;
//下面处理str其他操作 操作完之后 将 str清空
//这样可以提前销毁该对象,不需要系统一直保留该对象。
str = null ;
}