为什么重写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?的主要内容,如果未能解决你的问题,请参考以下文章