Declaring variables inside or outside of a loop

前端 未结 20 2057
后悔当初
后悔当初 2020-11-22 01:59

Why does the following work fine?

String str;
while (condition) {
    str = calculateStr();
    .....
}

But this one is said to be dangerou

20条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-22 02:40

    Warning for almost everybody in this question: Here is sample code where inside the loop it can easily be 200 times slower on my computer with Java 7 (and the memory consumption is also slightly different). But it is about allocation and not only scope.

    public class Test
    {
        private final static int STUFF_SIZE = 512;
        private final static long LOOP = 10000000l;
    
        private static class Foo
        {
            private long[] bigStuff = new long[STUFF_SIZE];
    
            public Foo(long value)
            {
                setValue(value);
            }
    
            public void setValue(long value)
            {
                // Putting value in a random place.
                bigStuff[(int) (value % STUFF_SIZE)] = value;
            }
    
            public long getValue()
            {
                // Retrieving whatever value.
                return bigStuff[STUFF_SIZE / 2];
            }
        }
    
        public static long test1()
        {
            long total = 0;
    
            for (long i = 0; i < LOOP; i++)
            {
                Foo foo = new Foo(i);
                total += foo.getValue();
            }
    
            return total;
        }
    
        public static long test2()
        {
            long total = 0;
    
            Foo foo = new Foo(0);
            for (long i = 0; i < LOOP; i++)
            {
                foo.setValue(i);
                total += foo.getValue();
            }
    
            return total;
        }
    
        public static void main(String[] args)
        {
            long start;
    
            start = System.currentTimeMillis();
            test1();
            System.out.println(System.currentTimeMillis() - start);
    
            start = System.currentTimeMillis();
            test2();
            System.out.println(System.currentTimeMillis() - start);
        }
    }
    

    Conclusion: Depending of the size of the local variable, the difference can be huge, even with not so big variables.

    Just to say that sometimes, outside or inside the loop DOES matter.

提交回复
热议问题