黑马程序员技术交流社区
标题:
关于hashmap底层存储比较的一点疑问
[打印本页]
作者:
微笑=.一瞬间
时间:
2014-4-30 11:41
标题:
关于hashmap底层存储比较的一点疑问
请大家先看一段程序:import java.util.*;
class HashMap1
{
public static void main(String[] args)
{
Student s1=new Student();
Student s2=new Student();
s1.setName("lisi");
s2.setName("lisi");
s1.setAge(11);
s2.setAge(11);
HashMap<Integer,Student> hm=new HashMap<Integer,Student>();
hm.put(1,s1);
hm.put(2,s2);
HashMap<Student,Integer> hm1=new HashMap<Student,Integer>();
hm1.put(s1,1);
hm1.put(s2,2);
System.out.println("hm的长度:"+hm.size());
System.out.println("hm1的长度:"+hm1.size());
}
}
class Student
{
private String name;
private int age;
public int hashCode()
{
return name.hashCode()+age*11;
}
public boolean equals(Object obj)
{
Student s=(Student)obj;
return this.name.equals(s.name)&&this.age==s.age;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public void setAge(int age)
{
this.age=age;
}
public int getAge()
{
return age;
}
public String toString()
{
return name+"---"+age;
}
}
输出结果:
通过结果我们可以知道 hashmap在存储时 底层Hash表比较的是键值是否相同, 而不去比较value的值,
现在想比较value的值而不去比较键值(其他什么都不动,让hashMap集合存入数据时保健的是value的值是否相同,也就是在程序中 输出时也让hm的长度为1)
请大神指点!!
55.png
(2.31 KB, 下载次数: 8)
下载附件
2014-4-30 11:37 上传
作者:
Lin0411
时间:
2014-5-1 18:03
hash算法测存数方式是将集合划分为若干各存储区域,根据对象的hashCode()值来决定应该将其存在哪个区域中。
在java应用程序执行期间,同一对象多次调用hashCode()时必须生成相同的hash值,如果两个对象经过equals()比较相等,则他们的hash值也必须相等。
反之,如果两个对象经过euqals()比较不相等,则他们的hash值不一定相等。
应为s1和s2经equals比较后相等,所以它们存储在集合中的区域也一样,故htm1.size()为1。
htm.size()为2很好理解,不再赘述。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2