黑马程序员技术交流社区
标题:
HashCode问题
[打印本页]
作者:
盛亚昆
时间:
2012-3-18 23:58
标题:
HashCode问题
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就要自己根据对象条件建立哈希值。有什么不同呢???
作者:
田啸
时间:
2012-3-19 00:18
本帖最后由 田啸 于 2012-3-19 00:23 编辑
hs.remove(new Person("a2",12));//这一句应该放到 Iterator it=hs.iterator(); 这一句之前
原因: Iterator是工作在一个独立的线程中,并且拥有一个 mutex锁,就是说Iterator在工作的时候,是不允许被迭代的对象被改变的. Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是就发生了如上所示的异常.java.util.ConcurrentModificationException
作者:
盛亚昆
时间:
2012-3-19 00:27
恩 对了 谢谢指点
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2