最近常常会用到一些之前看过却没有实际去实现的小细节,深有感慨(掌握一门技术绝不是看一遍就够了,一遍远远不够,远远不够........),
言归正传,先直接上代码
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
的比较顺序为:
- 计算对象的
Hash Code
,看在表中是否存在。 - 检查对应
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