A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周坤 中级黑马   /  2012-8-10 10:48  /  1685 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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+"空了");

        }

}

3 个回复

倒序浏览
本帖最后由 杜佳瑞 于 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+"空了");

        }

}

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
杨志 + 1 我也来赞一个!哈哈!
张忠豹 + 1 赞一个!

查看全部评分

回复 使用道具 举报
杜佳瑞 发表于 2012-8-10 11:11
port java.util.ArrayList;
import java.util.List;

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

不会改变的,刚开始接触迭代器的时候我也疑惑过,现在明白怎么回事了
这时当时我发的类似帖子,对你应该会有帮助。
http://bbs.itheima.com/thread-21248-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马