比如
public class TestFor { public static void main(String[] args) { // No.1
int x = 0;
for (int i = 0; i < 10; i++) {
System.out.println(x++);
} // No.2
for (int i = 0; i < 10; i++) {
int y = i;
System.out.println(y++);
}
}
}No.2中每次进入都会定义一个y,内存不是浪费了吗?
请指教

解决方案 »

  1.   

    但是如果for中有个大对象,占用内存很多的话,还是要考虑的
      

  2.   

    new 一个对象并没有你想象得那么消耗资源!
      

  3.   

    下面这个代码在 C 上好像没错,但 Java 上是有编译错误的。这也说明了,那个 x 在 for 块内和在 for 块外可能有着相同的生命周期,虽然说 for 块里面的 x 可见性更小,但它依赖生存到整个方法退出为止,如果这个x占用的空间大的话就是个问题。两种写法在逻辑上都没有差异,但具体在特定的问题第二种写法可能就有问题。要让第2种写法不导致内存溢出的话,我们必须在 y=i 之前多写一句代码 y = x。当我第一次在开源项目的代码中看到某个代码写着:x = null; // help GC,当然没想明白,这为什么能 "help GC" 呢。现在知道这句话并非是多余的。当然问题可能更多的出现在抽象类型上,基本类型可能没问题呢。
    public class X {    public static void main(String[] args) throws ParseException {
    int x = 1;

    for (int i =0; i< 3; i++){
        int x = 2;
    }
         }
    }
      

  4.   

    纠正:我们必须在 y=i 之前多写一句代码 y = null。
      

  5.   


    for 块里面的 x的生命周期只有在for里面吧
      

  6.   

    primitive类型数据效率应该不低的,再者就是虚拟机的优化...
      

  7.   

    你要知道java是在jvm上运行的,jvm的实现完全可以重用你那个y变量的内存
      

  8.   

    差别不大的,但 int y = i;会多了
     iload_
     istore
    指令,照理说多执行两条指令稍微慢点,这代码主要的看可读性的了
      

  9.   

    编译器会把for内的申明操作放到for外的
      

  10.   

    楼上不要误导了int y的话是在栈内存中分配的空间,根本没有创建对象,怎么会触动GC机制回收垃圾int 的y再多都是局部变量,只在栈中占一块内存,他是一个引用,指向的是整形数,尽管从性能上不如1,但是占内存绝对不大
      

  11.   

    反正我都是一般把变量定义在for循环的外边。
      

  12.   

    一出了for的作用域,for里面的临时变量都会被当成垃圾
      

  13.   

    我在C语言是定义在外面的,但是学了JAVA不知道为什么都是这样写的。
      

  14.   

    两个for下的变量作用域都是自己,不重叠
      

  15.   

    在for循环中定义对象的话,每循环一次就会创建一次对象,效率会相对低一点,不要这么用
      

  16.   


    没必要,因为每个y都是新的,而且数字不能为空。至于会不会占内存,可以负责任的说,不会。因为基本类型是存在栈里面的,随着对象作用域结束就消失了。
    如果是new出来的变量,就肯定会占内存。即使失去了引用,对象都在那里,不来不去。直到垃圾回收。
      

  17.   

    什么循环中创建对象是低效的,这种想法是一种杞人忧天。并不要认为 new 一个对象是一个很消耗性能的工作,其实完全不是!切记,不要进行一些自认为想当然的优化。
      

  18.   

    No3.for (int i = 0,y = 0; i < 10; i++) {
                y = i;
                System.out.println(y++);
            }
      

  19.   

    有的时候追求完美必然会带来一些其他的弊端,如果担心内存的话可以使用第一种方法,不过如果for循环中不是什么大的对象,可以使用第二种方法
      

  20.   

    new一个对象是java各种操作里面最耗资源的,能优化的最好优化一下。还有,for循环里面如果有重复的操作的话,大多编译器会放到for循环外面。
      

  21.   

    new一个对象是消耗资源,但是第二种方法并没有减轻new操作的压力,仅仅是把引用扔在了外边而已,所以没有任何优化作用
    除非你new的那个对象是一直不变的,不然还是用第一种方法吧,减小作用域,能更好的GC
      

  22.   

    感觉你们前面说的都是赋值符号前面的部分,这部分不管是大对象,还是小对象,实际只在栈上产生一个引用
    而真正new对象是在赋值符号后面部,这部分对象怎么创建出来是由程序逻辑决定的吧
    大部分人瞎掰