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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

请大家先看一段程序: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, 下载次数: 7)

55.png

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

1 个回复

倒序浏览
hash算法测存数方式是将集合划分为若干各存储区域,根据对象的hashCode()值来决定应该将其存在哪个区域中。
在java应用程序执行期间,同一对象多次调用hashCode()时必须生成相同的hash值,如果两个对象经过equals()比较相等,则他们的hash值也必须相等。
反之,如果两个对象经过euqals()比较不相等,则他们的hash值不一定相等。
应为s1和s2经equals比较后相等,所以它们存储在集合中的区域也一样,故htm1.size()为1。
htm.size()为2很好理解,不再赘述。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马