您的位置:首页 > 编程语言 > Java开发

java 关于Map的key可不可以是自定义对象的学习

2017-02-25 15:57 281 查看
JAVA   关于Map的key可不可以是自定义对象的学习

         虽说经常用map,但是我用它的时候,key都是用String或者Integer类型(我相信大多数人都会是这样用的,哈哈),今天偶然想到,可不可以用自己定义的对象作为map的key呢?

 

一、尝试一下

         首先我建了一个类

                     
public class Student{
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}


        

         又做了如下操作,嘿嘿,一切都感觉好规范,期待结果

              
                     
public static void main(String[] args) {
// TODO 自动生成的方法存根
Map map = new HashMap();
Student s1 = new Student();
s1.setName("一号");
s1.setSex("男");
Student s2 = new Student();
s2.setName("二号");
s2.setSex("女");
map.put(s1, "111");
map.put(s2, "222");
Set set = map.keySet(); //试了试遍历key,然后获取
for(Student s:set){
System.out.println(map.get(s));
}
System.out.println(map.get(s2)); //试了试单独根据key获取值
}


          一运行发现,他妈的好正确。。。

                   


               

       后来我就新建了一个Student对象,然后再次以这个对象为key去map里取值,然后我懵了,啥也没有了。

             

                   Student s4 = new Student();

              s4.setName("二号");

              s4.setSex("女");

              System.out.println(map.get(s4));

               


            

       我再仔细看我写的代码,才发现,太蠢了。

     因为map存储获取都是根据hashcode值和equals方法有联系,前边将map的key拿到再放进去获取value,并没有发生对象的变化,hashcode值也不变,下边我又以新的对象去map中获取,此时的hashcode值已经变了,所以返回为null,因为那是我新new的对象所以,map已经不认识了。

     怎么才能解决这个问题呢。重新Student的hashcode方法和equals方法就可以了,如下:

         

      
class Student{
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((sex == null) ? 0 : sex.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
return true;
}

}


    通过这种方式,就是new的新对象,只要是内容相同就会有相同的hashcode值,这样的话那map就认识这个新对象了。

总结:众所周知,map的key以不变的类型,比如String,Integer,作为key是最明智的,当然如果要以可变对象作为key的话,那就必须要重写hashcode和equals方法来达到这个目的,除此之外,别无他法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: