java 关于Map的key可不可以是自定义对象的学习
2017-02-25 15:57
281 查看
JAVA 关于Map的key可不可以是自定义对象的学习
虽说经常用map,但是我用它的时候,key都是用String或者Integer类型(我相信大多数人都会是这样用的,哈哈),今天偶然想到,可不可以用自己定义的对象作为map的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方法就可以了,如下:
通过这种方式,就是new的新对象,只要是内容相同就会有相同的hashcode值,这样的话那map就认识这个新对象了。
总结:众所周知,map的key以不变的类型,比如String,Integer,作为key是最明智的,当然如果要以可变对象作为key的话,那就必须要重写hashcode和equals方法来达到这个目的,除此之外,别无他法。
虽说经常用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方法来达到这个目的,除此之外,别无他法。
相关文章推荐
- Java中关于Map对象中改变Key值的问题
- 【Java学习笔记】HashSet中加入自定义的类的对象
- JAVA学习日志 关于调用方法、生成对象的例子。还是用数字卦程序修改
- 我的java学习笔记(5)关于对象构造
- question_016-JAVA之Map的HashMap键为自定义对象
- Android(java)学习笔记105:Map集合的遍历之键值对对象找键和值
- [java.io]关于List对象的引用是自定义类型写入文件
- JAVA学习第三十九课(常用对象API)— Map集合及其子类对象(集合使用技巧)
- java学习(十六):对象的自定义比较,Comparator和Comparable
- JS 自定义对象实现Java中的Map对象功能
- Java学习笔记(84)----------关于 Java 对象序列化你不知道的 5 件事
- 【Java学习笔记】Hashset判断自定义对象是否重复
- Android中关于JNI 的学习(三)在JNI层访问Java端对象
- Java基础学习中,关于面向对象中多态、抽象类、接口的总结
- 用自定义的对象作为Map的key
- 【Java学习笔记】HashSet中加入自定义的类的对象
- Java 将自定义的对象作为HashMap的key
- 关于Map中key和Value的灵活获取(推荐给初学JAVA的受苦受难的兄弟姐妹们)
- [WEB前端开发]-关于Velocity中Map与List操作-解决velocity无法识别Map对象key的问题
- 关于set或map的key使用自定义类型的问题