黑马程序员技术交流社区
标题:
关于HashMap问题。【已解决】
[打印本页]
作者:
张扬123
时间:
2012-8-19 22:55
标题:
关于HashMap问题。【已解决】
本帖最后由 张扬123 于 2012-8-20 15:38 编辑
不多说,先来代码。
import java.util.*;
class Student implements Comparable<Student>
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public int compareTo(Student s)
{
int num = new Integer(this.age).compareTo(new Integer(s.age));
if(num==0)
return this.name.compareTo(s.name);
return num;
}
public int hashCode()//一
{
return name.hashCode()+age*34;
}
public boolean equals(Object obj)//二
{
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student s = (Student)obj;
return this.name.equals(s.name) && this.age==s.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public String toString()
{
return name+"::"+age;
}
}
class MapTest
{
public static void main(String[] args)
{
HashMap<Student,String> hm = new HashMap<Student,String>();
hm.put(new Student("lisi1",21),"beijing");
hm.put(new Student("lisi1",21),"tianjin");
hm.put(new Student("lisi2",22),"shanghai");
hm.put(new Student("lisi3",23),"nanjing");
hm.put(new Student("lisi4",24),"wuhan");
Set<Student> keySet = hm.keySet();
Iterator<Student> it = keySet.iterator();
while (it.hasNext())
{
Student stu = it.next();
String addr=hm.get(stu);
System.out.println(stu+"..."+addr);
}
}
}
}
复制代码
把上面的一,二处的hashCode和equals删除之后,也就是没有复写,会出现两个lisi1都输出的情况。
再看下面的。没有复写,就不会出现两个。
这是为什么?
import java.util.*;
class MapDemo
{
public static void main(String[] args)
{
Map<String,String> map = new HashMap<String,String>( );
map.put("01","zhangsan1");
map.put("01","wangwu");
map.put("02","zhangsan2");
map.put("03","zhangsan3");
Collection<String> coll=map.values();
System.out.println(map);
}
}
复制代码
作者:
付星
时间:
2012-8-19 23:09
因为你下面用的Map<Stirng,String>
你看看String的源码有没有覆写呢,它是覆盖了hashcode和equals方法吧
作者:
潘星
时间:
2012-8-19 23:14
你没有复写Person对象的hashCode方法跟equals方法,person对象存到哈希集合中是按默认的对象的哈希值来存的,虽然2个Person对象内容相同,但确是2个不同的对象,所以哈希值不同,也就不是重复元素,而字符串如果内容相同的话就视为2个相同的对象。
作者:
王少岩
时间:
2012-8-20 09:53
对于HashMap集合,键的唯一性是通过作为键的元素对应的类中的hashCode和equals两个方法确定的,在向HashMap中添加元素的时候,首先会执行hashCode方法,如果返回的结果跟集合中其他元素执行hashCode后返回的结果相同,会自动执行equals方法,返回结果为true时,说明该键已存在,不再存入,只是把该键对应的值覆盖。
楼主删除Student类中的hashCode和equals两个方法后,向集合中添加元素时,会调用Object类中的hashCode方法,即使向集合添加貌似键相同的元素时,但他们执行hashCode返回的结果也不同,所以会出现两个lisi1。
而第二个例子,虽然没有手动的写hashCode和equals,但是向集合中添加的键是字符串,而String类覆盖了Object类的hashCode和equals方法,这两个方法能够确定字符串作为键时的唯一性,所以没有复写,也不会出现两个
作者:
张扬123
时间:
2012-8-20 15:38
谢谢,已解决。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2