为什么重写equals方法必须重写hashCode?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么重写equals方法必须重写hashCode?相关的知识,希望对你有一定的参考价值。

如果两个对象调用equals返回相等,那么这两个对象调用hashCode方法必须返回相同的整数。如果不重写hashCode,会违反该原则。这个原则主要针对的是映射操作(map接口)。

注意:

1. String重写了Object的equals,现在比较的是两个String所包含的char sequence是否相等。

  String s1 = new String("hello"); String s2 = new String("hello"); 

  s1.equals(s2)返回true

 

 1 import java.util.HashMap;  
 2 import java.util.Map;  
 3 public class MapTest {  
 4     public static void main(String[] args) {  
 5         Map<String,Value> map1 = new HashMap<String,Value>();  
 6         String s1 = new String("key");  
 7         String s2 = new String("key");    
 8         Value value = new Value(2);  
 9         map1.put(s1, value);  
10         System.out.println("s1.equals(s2):"+s1.equals(s2));  
11         System.out.println("map1.get(s1):"+map1.get(s1));  
12         System.out.println("map1.get(s2):"+map1.get(s2));  
13           
14           
15         Map<Key,Value> map2 = new HashMap<Key,Value>();  
16         Key k1 = new Key("A");  
17         Key k2 = new Key("A");  
18         map2.put(k1, value);  
19         System.out.println("k1.equals(k2):"+s1.equals(s2));  
20         System.out.println("map2.get(k1):"+map2.get(k1));  
21         System.out.println("map2.get(k2):"+map2.get(k2));  
22     }  
23       
24     /** 
25      * 键 
26      * @author zejian 
27      * 
28      */  
29     static class Key{  
30         private String k;  
31         public Key(String key){  
32             this.k=key;  
33         }  
34           
35         @Override  
36         public boolean equals(Object obj) {  
37             if(obj instanceof Key){  
38                 Key key=(Key)obj;  
39                 return k.equals(key.k);  
40             }  
41             return false;  
42         }  
43     }  
44       
45     /** 
46      * 值 
47      * @author zejian 
48      * 
49      */  
50     static class Value{  
51         private int v;  
52           
53         public Value(int v){  
54             this.v=v;  
55         }  
56           
57         @Override  
58         public String toString() {  
59             return "类Value的值-->"+v;  
60         }  
61     }  
62 }

 

以上是关于为什么重写equals方法必须重写hashCode?的主要内容,如果未能解决你的问题,请参考以下文章

为什么重写equals方法必须重写hashCode?

重写equals就必须重写hashCode的原理分析

java中为什么重写equals时必须重写hashCode方法?

为什么重写equals方法必须重写hashcode方法?

为什么重写equals时必须重写hashCode方法

为什么重写equals时必须重写hashCode方法?