黑马程序员技术交流社区

标题: 加强for循环的小疑问 [打印本页]

作者: 周坤    时间: 2012-8-10 10:48
标题: 加强for循环的小疑问
import java.util.ArrayList;
import java.util.List;

public class ForDemo {

        /**
         * @param args
         */
        public static void main(String[] args) {
                List list=new ArrayList();
                list.add(1);
                list.add(2);
                list.add(3);
                List list2=new ArrayList();
                list2.add(1);
                for(Object obj:list){
                        System.out.print(obj);
                        //list.remove(0);//会出java.util.ConcurrentModificationException
                        list=null;//list都空了,可为什么还能照常输出123呢?
                        list=list2;//此时list所指向的地址也变了,其中的元素也彻底的改变,为什么会照常输出123呢?
                }
                System.out.println(list+"空了");

        }

}
作者: 杜佳瑞    时间: 2012-8-10 11:11
本帖最后由 杜佳瑞 于 2012-8-10 11:12 编辑

port java.util.ArrayList;
import java.util.List;

public class ForDemo {

        /**
         * @param args
         */
        public static void main(String[] args) {
                List list=new ArrayList();
                list.add(1);
                list.add(2);
                list.add(3);
                List list2=new ArrayList();
                list2.add(1);
                //首先说明一下高级for循环和迭代器所实现的功能是一样的,同样限制也是一样的。只能遍历和查找,因为你在删除时,集合元素数量改变,导致循环次数不准确,这时会发生混乱也就会发生ConcurrentModificationException               
                for(Object obj:list){
                        System.out.print(obj);
                        //list.remove(0);//会出java.util.ConcurrentModificationException 解释如上
                        list=null;//list都空了,可为什么还能照常输出123呢?for each和迭代器一样在创建时就会产生一个执行表,所以在迭代过程集合的引用重新赋值不会影响到对这个集合的操作,只要集合体本身不发生变化即可。                     
               list=list2;//此时list所指向的地址也变了,其中的元素也彻底的改变,为什么会照常输出123呢?这里和赋空值是一个道理                }
                System.out.println(list+"空了");

        }

}
作者: 周坤    时间: 2012-8-10 11:54
杜佳瑞 发表于 2012-8-10 11:11
port java.util.ArrayList;
import java.util.List;

重新赋值也会影响吧,比如
list.set(1,2);就有影响list的值,打印的结果也会发生变化。
难道用set方法可以改变临时的那个执行表的值,而赋值为null,临时表不会变?
作者: 杜佳瑞    时间: 2012-8-10 13:50
周坤 发表于 2012-8-10 11:54
重新赋值也会影响吧,比如
list.set(1,2);就有影响list的值,打印的结果也会发生变化。
难道用set方法可 ...

不会改变的,刚开始接触迭代器的时候我也疑惑过,现在明白怎么回事了
这时当时我发的类似帖子,对你应该会有帮助。
http://bbs.itheima.com/thread-21248-1-1.html




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2