为什么重写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 }
时间: 2024-11-11 22:54:32

为什么重写equals方法必须重写hashCode?的相关文章

为什么重写equals方法还要重写hashcode方法?

我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类.Ojbect类中有两个方法equals.hashCode,这两个方法都是用来比较两个对象是否相等的. 在未重写equals方法我们是继承了object的equals方法,那里的 equals是比较两个对象的内存地址,显然我们new了2个对象内存地址肯定不一样 对于值对象,==比较的是两个对象的值 对于引用对象,比较的是两个对象的地址 默认的equals方法同==,一般来说我们的对象都是引用对象,要重写equ

为什么系列之重写equals方法必须重写hasCode方法?

Object源代码及注释 equals是Object的公有方法,那么我们通常都会在自己的类中重写这个equals方法,同时必须重写hasCode方法,知道为什么重写equals方法必须重写hasCode方法呢? /** * Returns a hash code value for the object. This method is * supported for the benefit of hash tables such as those provided by * {@link jav

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

自己学到这,就记录了下来,代码都是自己敲得,有不对的地方希望大神指点出来 如果你重写了equals,比如说是基于对象的内容实现的,而不重写 HashCode,那么很可能某两个对象明明是“相等”,而hashCode却不一样.那么就会返回 false.例如在 HashSet 集合中,不允许存在相同元素,但是当你 new 两个对象,对象内容相同时,在 HashSet 集合中就存在了相同的两个元素,如何解决这个问题?那就要重写 equals 方法,但是重写 equals 方法还不能解决问题,因为在 Ha

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

在上一篇博文Java中equals和==的区别中介绍了Object类的equals方法,并且也介绍了我们可在重写equals方法,本章我们来说一下为什么重写equals方法的时候也要重写hashCode方法. 先让我们来看看Object类源码 /** * Returns a hash code value for the object. This method is * supported for the benefit of hash tables such as those provided

java重写equals方法(重点讲解)

为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往需要重写equals()方法. 我们向一个没有重复对象的集合中添加元素时,集合中存放的往往是对象,我们需要先判断集合中是否存在已知对象,这样就必须重写equals方法. 怎样重写equals()方法? 重写equals方法的要求: 1.自反性:对于任何非空引用x,x.equals(x)应该返回tru

重写equals方法需要注意的几点

为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往需要重写equals()方法. 我们向一个没有重复对象的集合中添加元素时,集合中存放的往往是对象,我们需要先判断集合中是否存在已知对象,这样就必须重写equals方法. 怎样重写equals()方法? 重写equals方法的要求:1.自反性:对于任何非空引用x,x.equals(x)应该返回true

java重写equals方法需要注意的几点

为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往需要重写equals()方法. 我们向一个没有重复对象的集合中添加元素时,集合中存放的往往是对象,我们需要先判断集合中是否存在已知对象,这样就必须重写equals方法. 怎样重写equals()方法? 重写equals方法的要求:1.自反性:对于任何非空引用x,x.equals(x)应该返回true

equals方法的重写

一.为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往需要重写equals()方法. 我们向一个没有重复对象的集合中添加元素时,集合中存放的往往是对象,我们需要先判断集合中是否存在已知对象,这样就必须重写equals方法. 二.怎样重写equals()方法? 重写equals方法的要求:1.自反性:对于任何非空引用x,x.equals(x)应该返回

【原创】关于java对象需要重写equals方法,hashcode方法,toString方法 ,compareto()方法的说明

在项目开发中,我们都有这样的经历,就是在新增表时,会相应的增加java类,在java类中都存在常见的几个方法,包括:equals(),hashcode(),toString() ,compareto()这四个方法,对于刚刚接触java的初学者来说,对于这块可以没有更深入的了解,只是单纯意义上的复制粘贴,并没有很好的去了解.现在借用这个时间给大家说说这几个方法作用. equals: 比较两个对象相等时使用(需要配合Hashcode一起使用,在后边再进行详细解释)   hashcode: 重写has