求解释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的简单循环

解决方案 »

  1.   

    先不谈开销问题,这两段代码实现的功能都不同怎么比较?第一个是把数字逐步累积拼接成一个字符串,再处理,第二个是每个数字作为一个字符串来处理。实现功能不同怎么比较?另外如果要考虑开销跟效率问题,不能使用String,for循环里面每次都会创建出来一个新的String对象,使用StringBuffer吧,直接append(内容),不生成新对象。
      

  2.   

    楼主的主要问题是这个:变量str是在for循环体里面定义还是在for循环体外部定义。就性能而言第一种较好(但是好多少,不好说,一般可以忽略,如果你真的首要考虑性能的话还是建议用第一个);如果str只在循环体内有效的话,同时首要考虑程序的规范性的话,其次才考虑性能的话建议第二个。
    原因(摘自http://www.iteye.com/problems/74037)如下:
    放在循环内部定义,确实会多次申请栈帧的内存空间(java中一个线程对应一个Java栈,每次方法调用会向栈中压入一个新帧,帧中存储着参数、局部变量、中间运算结果等等数据,方法调用结束后当前的帧就被弹出了,为什么会多占用栈空间内,原因很简单,每次循环都要重复定义局部变量,而如果放在循环体外,每次只要移动引用指向的堆内存地址即可,不必重新申请内存空间了。
      

  3.   

    不相伯仲吧。自己测试呗。package card;public class Test {
    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 + "";
    }
    }
    }
      

  4.   

    试了下,50000以为,下面比上面快2~5倍,再大的数之后,快大概5~6分之1~~~猜测:int + ""总是生成新的对象,
         第一个会将生成的新对象赋值给str,而前一个生成的对象,没有明确抛弃,垃圾回收的时候也比较的耗时。
         第二个局部对象将不做再赋值操作,切明确该块结束时,将进行垃圾回收,明确回收的对象,耗时较低。PS:在JAVA中,明确不再需要的值,赋值为null,速度的提升是比较明显的。
      

  5.   


    好吧,我错了,速度都差不多一样。
    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);总是前面的程序比后面的程序耗时..........
      

  6.   

    首先是一个局部变量和一个全局变量比较开销问题,建议用StringBuffer做这个第一题目,相对代码要好些。两种语句功能不同,开销用测JAVA时长的语句一测便知:        long startTime=System.currentTimeMillis();//开始   
            long endTime=System.currentTimeMillis();//结束  
      

  7.   

    建议使用StringBuffer来使用,这种方法只会返回当前字符串
      

  8.   

    如果你要算开销的话,我建议代码最好这样写String str = null ;
    for(int i=0;i < 5;i++){
        str = String.valueOf( i ) ;
        //下面处理str其他操作  操作完之后 将 str清空
        //这样可以提前销毁该对象,不需要系统一直保留该对象。
        str = null ;
        
    }