Java自定义类型作为HasMap的key的查找

最近常常会用到一些之前看过却没有实际去实现的小细节,深有感慨(掌握一门技术绝不是看一遍就够了,一遍远远不够,远远不够........),

言归正传,先直接上代码

Attributeresult

 1 public class Attributeresult {
 2     String value;
 3     String result;
 4
 5     public Attributeresult() {
 6
 7     }
 8
 9     public Attributeresult(String value, String result) {
10         this.value = value;
11         this.result = result;
12     }
13
14     @Override
15     public boolean equals(Object o) {
16         if (this == o)
17             return true;
18         if (o == null || getClass() != o.getClass())
19             return false;
20         Attributeresult attributeresult = (Attributeresult) o;
21         if (attributeresult.result == null || attributeresult.value == null)
22             return false;
23         if (value.equals(attributeresult.value) && result.equals(attributeresult.result))
24             return true;
25         return false;
26     }
27
28     @Override
29     public int hashCode() {
30         return value != null ? value.hashCode() : 0;
31     }
32     public static void main(String[] args) {
33         Map<Attributeresult, Integer> valuelist = new HashMap<Attributeresult, Integer>();
34         valuelist.put(new Attributeresult("mim", "yes"), 20);
35         valuelist.put(new Attributeresult("mim", "no"), 1);
36         valuelist.put(new Attributeresult("xunying", "yes"), 60);
37         valuelist.put(new Attributeresult("xunying", "no"), 2);
38         valuelist.put(new Attributeresult("mini", "no"), 2);
39         if(valuelist.containsKey(new Attributeresult("xunying","yes"))){
40             System.out.println("存在");
41         }else{
42             valuelist.put(new Attributeresult("mini","yes"),30);
43         }
44     }
45
46 }

运行结果肯定是:存在

这里面Attributeresult类重载了hasCode()方法和equals()方法,所以才能查找存在,如果不重写,containsKey()返回的必然是false,因为默认情况下是:

HashMap中,查找key的比较顺序为:

  1. 计算对象的Hash Code,看在表中是否存在。
  2. 检查对应Hash Code位置中的对象和当前对象是否相等

第一步就是要用到hashCode()方法,而第二步就是要用到equals()方法。

在没有进行重载时,在这两步会默认调用Object类的这两个方法,而在Object中,Hash Code的计算方法是根据对象的地址进行计算的。

  • 重载hashCode()是为了对同一个key,能得到相同的Hash Code,这样HashMap就可以定位到我们指定的key上。
  • 重载equals()是为了向HashMap表明当前对象和key上所保存的对象是相等的,这样我们才真正地获得了这个key所对应的这个键值对。

上面的总结是源于https://segmentfault.com/a/1190000002655085,感谢

时间: 2024-10-07 17:57:04

Java自定义类型作为HasMap的key的查找的相关文章

一个关于自定义类型作为HashMap的key的问题

在之前的项目需要用到以自定义类型作为HashMap的key,遇到一个问题:如果修改了已经存储在HashMap中的实例,会发生什么情况呢?用一段代码来试验: import java.util.HashMap; import java.util.Map; public class TestHashMap { public static void main(String[] args) { testObjAsKey(); } private static void testObjAsKey() { c

java自定义类型 作为HashMap中的Key值 (Pair&lt;V,K&gt;为例)

由于是自定义类型,所以HashMap中的equals()函数和hashCode()函数都需要自定义覆盖. 不然内容相同的对象对应的hashCode会不同,无法发挥算法的正常功能,覆盖equals函数,应该就相当于c++重载==运算符来保证能判断是否相等.只不过java没有自定义重载运算符这个功能的,需要进行函数覆盖. equals的函数原型是 boolean equals(Object o);注意括号内.hashCode的函数原型就是int hashCode(); 先看一段代码: import

java自定义类型 比较排序 Comparator接口

String service_time = "6:00:00,7:00:00,8:00:00,9:00:00,10:00:00,11:00:00,12:00:00,13:00:00,14:00:00,15:00:00,16:00:00,17:00:00,18:00:00,19:00:00,20:00:00,21:00:00,22:00:00 "; List<String> list = StringUtil.stringToList(service_time, "

java.lang.Comparable, java.util.Compartor区别以及Hadoop中关于自定义类型中的compare方法

public interface Comparable<T> { public int compareTo(T o); } 规定了对象内部比较的方法 public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); } 定义外部比较器的基本方法,其中equals是用来确定两个比较器是否相等. 关于对象内部比较和外部比较这两个接口的区别和使用场景如下: 个人总结: Compara

java编程排序之自定义类型的集合,按业务需求排序

自定义引用类型放入集合中,按实际业务需求进行排序的两种思路 第一种思路: (1)自定义实体类实现java.lang.Comparable接口,重写public int compareTo(Object obj)方法.自定义业务比较规则 (2)利用java.util.Collections类的静态方法sort(List<自定义类型> list)进行排序(默认升序)或者.自己编写排序工具类.冒泡+compareTo(obj)方法 第二种思路 (1)自己编写业务比较规则类.实体类不用实现任何借口.业

[原创]java WEB学习笔记67:Struts2 学习之路-- 类型转换概述, 类型转换错误修改,如何自定义类型转换器

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

map以自定义类型当Key

关于map的定义: template < class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key,T> > > class map; 第一个template参数被当做元素的key,第二个template参数被当作元素的value.Map的元素型别Key和T,必须满足以下两个条件:1.key/value必须具备assignable(可赋值

Java自定义实现String类型转换为int

Java自定义实现String转换为int 的简单实现! public class StringToInt { public static int stringToInt (String str){ char[] num = str.toCharArray();//得到各个字符的char int result = 0; for(int i = 0; i < num.length; i++){ if(num[i]>57||num[i]<48){//0~9对应的Ascall码 System.

Hadoop日记Day13---使用hadoop自定义类型处理手机上网日志

测试数据的下载地址为:http://pan.baidu.com/s/1gdgSn6r 一.文件分析 首先可以用文本编辑器打开一个HTTP_20130313143750.dat的二进制文件,这个文件的内容是我们的手机日志,文件的内容已经经过了优化,格式比较规整,便于学习研究,感兴趣的读者可以尝试一下. 我从中截取文件中的一行记录内容进行分析: 1363157985066     13726230503    00-FD-07-A4-72-B8:CMCC    120.196.100.82    i