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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 盛亚昆 中级黑马   /  2012-3-18 23:58  /  1522 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
class  HashCodeDemo
{
        public static void main(String[] args)
        {
                HashSet hs=new HashSet();
                hs.add(new Person("a1",11));
                hs.add(new Person("a2",12));
               
                hs.add(new Person("a3",13));
               
                hs.add(new Person("a4",14));
                Iterator it=hs.iterator();
               
                //sop(hs.contains(new Person("a2",12)));
                hs.remove(new Person("a2",12));//怎么出现错误了呢????求解

                while (it.hasNext())

                {
                        Person p =(Person)it.next();
                        sop(p.getName()+"+++"+p.getAge());
                }
        }
                public static void sop(Object obj)
                {
                        System.out.println(obj);
                }

}
        class Person
        {
        private String name;
        private int age;
        Person (String name,int age)
        {
                        this.name=name;
                        this.age=age;
       
        }
        public int hashCode()//根据对象条件建立哈希值。描述事物需要往集合里存事物都要复写
        {
                System.out.println(this.name+"....hashCode");
                return name.hashCode()+age*39;//乘以一个数值返回来一个值随意
       
        }
        public boolean equals(Object obj)//覆盖这个方法
        {
                if (!(obj instanceof Person))
                        return false;

                Person p=(Person)obj;
                System.out.println(this.name+".equals..."+p.name);
                return this.name.equals(p.name)&&this.age==p.age;
               
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
       
                return age;
        }

出现错误
a1....hashCode
a2....hashCode
a3....hashCode
a4....hashCode
a2....hashCode
a2.equals...a2
Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
        at java.util.HashMap$KeyIterator.next(HashMap.java:828)
        at HashCodeDemo.main(HashCodedDemo.java:23)
没用HashCode用ArrayList就可以调用equals,用HashCode就要自己根据对象条件建立哈希值。有什么不同呢???
       

2 个回复

倒序浏览
本帖最后由 田啸 于 2012-3-19 00:23 编辑

hs.remove(new Person("a2",12));//这一句应该放到  Iterator it=hs.iterator(); 这一句之前

原因: Iterator是工作在一个独立的线程中,并且拥有一个 mutex锁,就是说Iterator在工作的时候,是不允许被迭代的对象被改变的. Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是就发生了如上所示的异常.java.util.ConcurrentModificationException
回复 使用道具 举报
恩 对了 谢谢指点
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马