equals()和hashCode()隐式调用时的约定

package com.hash;

import java.util.HashMap;

public class Apple {
    private String color;  

    public Apple(String color) {
        this.color = color;
    }  

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((color == null) ? 0 : color.hashCode());
        return result;
    }

    public boolean equals(Object obj) {
        if (!(obj instanceof Apple))
            return false;
        if (obj == this)
            return true;
        return this.color == ((Apple) obj).color;
    } 

    public static void main(String[] args) {
        Apple a1 = new Apple("green");
        Apple a2 = new Apple("red");  

        //hashMap stores apple type and its quantity
        HashMap<Apple, Integer> m = new HashMap<Apple, Integer>();
        m.put(a1, 10);
        m.put(a2, 20);
        System.out.println(m.get(new Apple("green")));
    }
} 

从上文代码不难看出,HashMap已保存一个"green"的Apple对象,但是,,在执行时,会发生一个问题,,,用map获取"Apple"对象时,并未找到。

然而,为什么会造成这问题呢,,,这就是本文主旨所在。

---是由于hashCode()引起,因为没有重写hashCode()方法.

equals()方法与hashCode()方法的隐式调用时的约定是:

1.如果两个对象相等(equals),那么他们必须拥有相同的哈希吗(hashCode)

2.即使两个对象拥有相同的hashCode,他们也不一定相等.

Map的核心思想就是可以比线性查找更快. 通过散列值(hash)作为键(key)来定位对象的过程分为两步:
在Map内部,存储着一个顶层数组,顶层数组的每个元素指向其他的数组,查找或存储的时候,先根据key对象的hashCode()值计算出数组的索引,然后到这个索引找到所指向的第二层线性数组,使用equals方法来比较是否有相应的值(以返回或者存储).
Object类中的hashCode()默认为每个对象返回不同的int值,因此在上面的例子中,两个相等(equal)的对象,返回了不同的hashCode值.
解决方法是为此类添加hashCode方法,比如,使用color字符串的长度作为示范:

public int hashCode(){
    // 此种实现,要求 color值定以后就不得修改
    // 否则同一个物理对象,前后有两个不同的hashCode,逻辑上就是错的。
    return this.color.length();
} 

参考地址:http://www.acfun.tv/a/ac1876770

时间: 2024-09-28 03:13:30

equals()和hashCode()隐式调用时的约定的相关文章

重写equals和hashCode方法的示例

如果一个类有自己特有的"逻辑相等",且需要以此进行比较时,那么就需要重写equals方法. 在Object的规范中,重写equals方法有下面几条通用约定: 自反性. x.equals(x) == true 对称性.if   y.equals(x) == true , then  x.equals(y) == true 传递性.if   x.equals(y) == true y.equals(x) == true , then x.equals(z) == true 一致性.如果比较

看Java中==、equals、hashCode的来龙去脉

我有一个哥们去参加了面试,面试官这样问一个Java问题: 你说一下java对象的equals方法调用什么方法呢?我这个哥们想了想,回答说"应该是比较的引用".听了这个答案之后,那个面试官摇头晃脑的说:"不对,你回答的不对,equals方法调用的是hashCode方法".于是乎,我那个技术还不错的哥们就悲壮地栽在这道题目上了. 今天晚上,西安历史上少有的热,那就好好总结一下这个题目的来龙去脉好了,也方便给后面的朋友们提个醒,不要栽在这么简单的问题上.你说这个面试官回答

equals与hashCode的剖析

Java中有两条众所周知的规定 1)对象相等必须有相等的hashCode 2)两个对象不相等,hashCode可能相同 但是为什么有这两个规定呢,不可能凭空产生,总是有原因的,下面我们就来分析两条规定的由来 1. 哈希码 首先这两条规定和哈希码密不可分,甚至可以说这两条规定就是为了对象的hashCode()实现. hashCode()方法返回的就是该对象的哈希码,是一个整数,通过该哈希码我们可以确定该对象在散列存储结构中的地址(比如Set,HashMap的key),快速索引该对象,查找效率极高.

一次性搞清楚equals和hashCode

前言 在程序设计中,有很多的“公约”,遵守约定去实现你的代码,会让你避开很多坑,这些公约是前人总结出来的设计规范. Object类是Java中的万类之祖,其中,equals和hashCode是2个非常重要的方法. 这2个方法总是被人放在一起讨论.最近在看集合框架,为了打基础,就决定把一些细枝末节清理掉.一次性搞清楚! 下面开始剖析. public boolean equals(Object obj) Object类中默认的实现方式是  :   return this == obj  .那就是说,

java-“==”、equals和hashcode有什么区别

1)"=="运算符是比较两个变量的值是否相等.也就是说,该运算符用于比较变量对应的内存中所存储的值是否相等,要比较两个基础类型的数据或两个引用变量是否相等,只能使用"=="运算符. 具体而言,如果两个变量是基础类型,可以直接使用"=="运算符判断对应的值是否相等.如果一个变量指向的是对象(引用类型),那么,此时涉及两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如对于语句String s = new String(),变量s占用一

Java实战equals()与hashCode()

一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equals(Object obj) { return (this == obj); } 很明显是对两个对象的地址值进行的比较(即比较引用是否相同).但是我们知道,String . Math.Integer.Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方 法. 比如在String类中如下: 代码 public boolean eq

equals()和hashcode()详解

转载自http://www.cnblogs.com/Qian123/p/5703507.html java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础,所以是每一个类的父类.所有的对象,包括数组,都实现了在Object类中定义的方法. equals()方法详解 equals()方法是用来判断其他的对象是否和该对象相等. equals()方法在ob

Java提高篇——equals()与hashCode()方法详解

java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础,所以是每一个类的父类.所有的对象,包括数组,都实现了在Object类中定义的方法. equals()方法详解 equals()方法是用来判断其他的对象是否和该对象相等. equals()方法在object类中定义如下: public boolean equals(Object obj)

Java中==和equals的区别,equals和hashCode的区别

在java中: ==是运算符,用于比较两个变量是否相等. equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样.Object的equals方法如下: public boolean equals(Object obj) { return (this == obj); } hashCode也是Object类的一个方法.返回一个离散的int型整数.在集合类操作中使用,为了提高查询速度.(HashMap,HashSet等