Java用自定义的类型作为HashMap的key
2017-01-10 23:48
323 查看
需要重写hashCode()和equals()方法才可以实现自定义键在HashMap中的查找。
运行结果为:
{package1.PhoneNumber@74a14482=zhangsan, package1.PhoneNumber@677327b6=wangwu, package1.PhoneNumber@1540e19d=lisi, package1.PhoneNumber@14ae5a5=abc}
null
null
null
从中我们可以看到出现了两个问题:
new PhoneNumber(027, 33333333)这个键被添加了两次,但是在HashMap中wangwu和abc同时存在了
使用get方法取得的值均为null
正确的方法就是直接对PhoneNumber类进行修改,覆盖equals和hashCode方法,修改后的PhoneNumber类如下:
重新执行上述函数,结果为:
{package1.PhoneNumber@1fce2ef=abc, package1.PhoneNumber@bca3e8=zhangsan, package1.PhoneNumber@1535828=lisi}
zhangsan
lisi
abc
可以看到,之前出的错误都被改正了
在HashMap中,查找key的比较顺序为:
计算对象的HashCode,看在表中是否存在
检查HashCode位置中的对象是否与当前对象相等
以上使用计算HashCode的方法在effective java第九点中提到:
对于对象中每个关键域f,为该域计算int类型的散列码c,result = 31 * result + c
public class PhoneNumber { private int prefix; //区号 private int phoneNumber; //电话号 public PhoneNumber(int prefix, int phoneNumber) { this.prefix = prefix; this.phoneNumber = phoneNumber; } }
import java.util.HashMap; public class Test1 { public static void main(String[] args) { HashMap<PhoneNumber, String> map = new HashMap<>(); map.put(new PhoneNumber(027, 12345678), "zhangsan"); map.put(new PhoneNumber(027, 22222222), "lisi"); map.put(new PhoneNumber(027, 33333333), "wangwu"); map.put(new PhoneNumber(027, 33333333), "abc"); System.out.println(map.toString()); System.out.println(map.get(new PhoneNumber(027, 12345678))); System.out.println(map.get(new PhoneNumber(027, 22222222))); System.out.println(map.get(new PhoneNumber(027, 33333333))); } }
运行结果为:
{package1.PhoneNumber@74a14482=zhangsan, package1.PhoneNumber@677327b6=wangwu, package1.PhoneNumber@1540e19d=lisi, package1.PhoneNumber@14ae5a5=abc}
null
null
null
从中我们可以看到出现了两个问题:
new PhoneNumber(027, 33333333)这个键被添加了两次,但是在HashMap中wangwu和abc同时存在了
使用get方法取得的值均为null
正确的方法就是直接对PhoneNumber类进行修改,覆盖equals和hashCode方法,修改后的PhoneNumber类如下:
public class PhoneNumber { private int prefix; //区号 private int phoneNumber; //电话号 public PhoneNumber(int prefix, int phoneNumber) { this.prefix = prefix; this.phoneNumber = phoneNumber; } @Override public boolean equals(Object o) { if(this == o) { return true; } if(!(o instanceof PhoneNumber)) { return false; } PhoneNumber pn = (PhoneNumber)o; return pn.prefix == prefix && pn.phoneNumber == phoneNumber; } @Override public int hashCode() { int result = 17; result = 31 * result + prefix; result = 31 * result + phoneNumber; return result; } }
重新执行上述函数,结果为:
{package1.PhoneNumber@1fce2ef=abc, package1.PhoneNumber@bca3e8=zhangsan, package1.PhoneNumber@1535828=lisi}
zhangsan
lisi
abc
可以看到,之前出的错误都被改正了
在HashMap中,查找key的比较顺序为:
计算对象的HashCode,看在表中是否存在
检查HashCode位置中的对象是否与当前对象相等
以上使用计算HashCode的方法在effective java第九点中提到:
对于对象中每个关键域f,为该域计算int类型的散列码c,result = 31 * result + c
相关文章推荐
- Java用自定义的类型作为HashMap的key
- 一个关于自定义类型作为HashMap的key的问题
- Java 将自定义的对象作为HashMap的key
- 自定义类型作为HashMap或HashTable的key需要注意哪些问题
- Java用自定义的类作为HashMap的key值实例
- Java 用自定义类型作为HashMap的键
- java用自定义类型作为HashMap的键
- java HashMap用自定义类作为key
- 知识点总结: c#,使用自定义类型来作为Dictionary的Key
- java中hashMap使用一个对象作为key时,对key进行唯一性表达重写equals()方法
- 以自定义对象作为hashmap的key需要注意什么
- java HashMap用自定义类做key(二)
- Java 在 Map 中使用复杂数据类型作为 Key
- Java 将自己定义的对象作为HashMap的key
- 从头认识java-15.7 Map(5)-介绍HashMap的工作原理-Key变了,能不能get出原来的value?(偶尔作为面试题)
- java:警告:[unchecked] 对作为普通类型 java.util.HashMap 的成员的put(K,V) 的调用未经检查
- Java 自定义类作为HashMap的key
- equals和==的区别,以及如何将自定义类作为HashMap的Key
- Java用自定义的类作为HashMap的key值
- 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key