《effective java》 第46条:for-each循环优先于传统的for循环

版权声明:本文为博主原创文章,转载请说明出处 https://blog.csdn.net/u010002184/article/details/89472795
    enum NUMS {ONE, TWO, THREE, FOUR, FIVE, SIX}

    enum NUMS2 {ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN}

    public static void main(String[] args) {

        Collection<NUMS> nums = Arrays.asList(NUMS.values());

        /**
         * 只能输出6种
         */
        for (Iterator i = nums.iterator(); i.hasNext(); ) {
            System.out.println("111");
            for (Iterator j = nums.iterator(); j.hasNext(); ) {
                System.out.println("222");
                System.out.println(i.next() + " " + j.next());
            }
        }
//        111
//        222
//        ONE ONE
//        222
//        TWO TWO
//        222
//        THREE THREE
//        222
//        FOUR FOUR
//        222
//        FIVE FIVE
//        222
//        SIX SIX


        Collection<NUMS2> nums2s = Arrays.asList(NUMS2.values());

        /**
         * 外层集合报异常NoSuchElementException
         */
        for (Iterator i = nums.iterator(); i.hasNext(); ) {
            System.out.println("111");
            for (Iterator j = nums2s.iterator(); j.hasNext(); ) {
                System.out.println("222");
                System.out.println(i.next() + " " + j.next());//此时j.hasNext返回true,后面还有元素,而i.next()在上次循环时已到达尾部,外层集合报异常NoSuchElementException
            }
        }
//        111
//        222
//        ONE ONE
//        222
//        TWO TWO
//        222
//        THREE THREE
//        222
//        FOUR FOUR
//        222
//        FIVE FIVE
//        222
//        SIX SIX
//        222
//        Exception in thread "main" java.util.NoSuchElementException


        /**
         * 外层集合报异常NoSuchElementException
         */
        for (Iterator i = nums2s.iterator(); i.hasNext(); ) {
            System.out.println("111");
            for (Iterator j = nums.iterator(); j.hasNext(); ) {
                System.out.println("222");
                System.out.println(i.next() + " " + j.next());//此时j.hasNext进行两轮循环,第二次循环时j.hasNext()没有到达末尾,返回true,而i.next()在一轮循环时已到达尾部,外层集合报异常NoSuchElementException
            }
        }
//        111
//        222
//        ONE ONE
//        222
//        TWO TWO
//        222
//        THREE THREE
//        222
//        FOUR FOUR
//        222
//        FIVE FIVE
//        222
//        SIX SIX
//        111
//        222
//        SEVEN ONE
//        222
//        EIGHT TWO
//        222
//        NINE THREE
//        222
//        TEN FOUR
//        222
//        Exception in thread "main" java.util.NoSuchElementException


        /**
         * 这样才能保证36种组合(保证i.next()没有在内层循环执行)
         */
        for (Iterator i = nums.iterator(); i.hasNext(); ) {
            NUMS n = (NUMS) i.next();
            for (Iterator j = nums.iterator(); j.hasNext(); ) {
                System.out.println(n + " " + j.next());
            }
        }
//        ONE ONE
//        ONE TWO
//        ONE THREE
//        ONE FOUR
//        ONE FIVE
//        ONE SIX
//        TWO ONE
//        TWO TWO
//        TWO THREE
//        TWO FOUR
//        TWO FIVE
//        TWO SIX
//        THREE ONE
//        THREE TWO
//        THREE THREE
//        THREE FOUR
//        THREE FIVE
//        THREE SIX
//        FOUR ONE
//        FOUR TWO
//        FOUR THREE
//        FOUR FOUR
//        FOUR FIVE
//        FOUR SIX
//        FIVE ONE
//        FIVE TWO
//        FIVE THREE
//        FIVE FOUR
//        FIVE FIVE
//        FIVE SIX
//        SIX ONE
//        SIX TWO
//        SIX THREE
//        SIX FOUR
//        SIX FIVE
//        SIX SIX

    }

i.next在内层循环时每次也执行了,导致j.next到达末尾时,同时也导致i.hashNext返回false,故只会输出6种组合。

使用for-each:

    for (NUMS m : nums)
            for (NUMS2 n : nums2s)
                System.out.println(m + " " + n);
//        ONE ONE
//        ONE TWO
//        ONE THREE
//        ONE FOUR
//        ONE FIVE
//        ONE SIX
//        ONE SEVEN
//        ONE EIGHT
//        ONE NINE
//        ONE TEN
//        TWO ONE
//        TWO TWO
//        TWO THREE
//        TWO FOUR
//        TWO FIVE
//        TWO SIX
//        TWO SEVEN
//        TWO EIGHT
//        TWO NINE
//        TWO TEN
//        THREE ONE
//        THREE TWO
//        THREE THREE
//        THREE FOUR
//        THREE FIVE
//        THREE SIX
//        THREE SEVEN
//        THREE EIGHT
//        THREE NINE
//        THREE TEN
//        FOUR ONE
//        FOUR TWO
//        FOUR THREE
//        FOUR FOUR
//        FOUR FIVE
//        FOUR SIX
//        FOUR SEVEN
//        FOUR EIGHT
//        FOUR NINE
//        FOUR TEN
//        FIVE ONE
//        FIVE TWO
//        FIVE THREE
//        FIVE FOUR
//        FIVE FIVE
//        FIVE SIX
//        FIVE SEVEN
//        FIVE EIGHT
//        FIVE NINE
//        FIVE TEN
//        SIX ONE
//        SIX TWO
//        SIX THREE
//        SIX FOUR
//        SIX FIVE
//        SIX SIX
//        SIX SEVEN
//        SIX EIGHT
//        SIX NINE
//        SIX TEN

end

猜你喜欢

转载自blog.csdn.net/u010002184/article/details/89472795