黑马程序员技术交流社区

标题: 关于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, 下载次数: 2)

55.png

作者: 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