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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


复制代码
运行结果:[李跛子, 王二麻子, 张拐子]
为神马没出现所谓的"并发修改异常"啊?而且结果怎么也没变?好心碎...本来没学好,然后敲了一段自己都看不懂的代码,头都大了.求大大神指点哦~~~!

9 个回复

倒序浏览
代码在此,不好意思啊,出了点意外:
public class Demo{       
        public static void main(String[] args) {
                Student[] stus = new Student[3];
                stus[0] = new Student("李跛子");
                stus[1] = new Student("王二麻子");
                stus[2] = new Student("张拐子");
                delete(stus);
                System.out.println(Arrays.toString(stus));
        }
        private static void delete(Student[] stus) {
                for (Student student : stus) {
                        if ("张拐子".equals(student.name)) {
                                student = null;
                                break;
                        }
                }
        }
}
class Student {
        public String name;
        public Student(String name) {
                this.name = name;
        }
        public String toString() {
                return name;
        }
}
回复 使用道具 举报
for (Student student : stus)中 student = null的问题,改为stus=null
回复 使用道具 举报
HeiMaZ 发表于 2016-5-24 22:44
for (Student student : stus)中 student = null的问题,改为stus=null

改了,结果也没变额...
回复 使用道具 举报
HeiMaZ 发表于 2016-5-24 22:44
for (Student student : stus)中 student = null的问题,改为stus=null

改了,结果也没变额...
回复 使用道具 举报
你把break去掉试试,他检测是在next上
回复 使用道具 举报
集合里的都是地址值,你的那个对象是new的,应该是堆里面的,你是在堆里面赋值为null了,而常量池里面的地址值没改变
回复 使用道具 举报
增强for底层是迭代器,当方法检测到对象的并发修改,但不允许这种修改时抛出并发修改异常,直接将new出来的对象赋值为空只是在堆内存中赋值为空了,集合元素中并没有改变,集合中是对象在堆内存中的地址值。比如你使用add或者delete方法修改集合元素就会报ConcurrModificatExcepti
回复 使用道具 举报
你这个问题和并发异常没有关系,student=null;这个对象地址变成null,就跟原来的数组没有关系了,所以改变不了,如果你试试student.name=null,就能改变。
回复 使用道具 举报
并发修改是在遍历的时候改变集合元素个数才会出现。改值不影响
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马