`
勒布朗
  • 浏览: 70536 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Java中的equals()和hashcode()的方法的理解

阅读更多
以前知道只是知道结果,没有去探究原因,只是知道两个对象比较时,如果两个对象equal()比较时返回TRUE的话,则两个对象的hashcode()一定相等,反之则不一定!这是为什呢,并且Java中建议重写equals()方法时最好(有时是一定)要重写hashcode()方法!
在Java比较两个对象是否相等时有如下规则:
首先判断两个对象的 hashCode 是否相等,如果不相等,认为两个对象也不相等,反之如果相等,则用equals()比较。
用equals()比较时,如果不相等,认为两个对象也不相等 ,如果相等,认为两个对象等!
所以在比较对象是否相等时有个顺序,先比较的是对象的hashcode()在用equals()比较。
例如在map中,我们知道map存放键值时是不容许键重复的,但是要以对象作为键存入map中时,怎样才能判断存入的对象是否相等呢,下面是hashmap类中put()和get()方法的源码!
一看便知:
put:

/**
    我们把对象放到map中去时,要和map中以前的键进行比较
*/
   public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
//我们看到先是比较hashcode(),再是equals();所以如果此时只重写了equals()方而
//没有重写hashcode(),那么在对象比较hashcode()不相等时就返回了false,后 面 的//equals()也就根本不调用了,没有用。
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }



/////////////////////////////////////////////////////////////////
get:

/**
   get()方法,取得时候也是同样的道理,要将传入的键和map中的键比较,找的相等的 
取map中对应的键值。
*/
    public V get(Object key) {
        if (key == null)
            return getForNullKey();
        int hash = hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
//我们看到先是比较hashcode(),再是equals()
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                return e.value;
        }
        return null;
    }

分享到:
评论

相关推荐

    深入理解equals和hashCode方法

    在Java中,equals和hashCode方法是Object中提供的两个方法,这两个方法对以后的学习有很大的帮助,本文就深度来去讲解这两个方法。下面小编带大家来一起学习吧

    Java中hashCode和equals方法的正确使用

    在这篇文章中,我将告诉大家我对hashCode和equals方法的理解。我将讨论他们的默认实现,以及如何正确的重写他们。我也将使用Apache Commons提供的工具包做一个实现。  hashCode()和equals()定义在Object类中,这...

    深入理解Java中HashCode方法

    主要介绍了深入理解Java中HashCode方法,具有一定借鉴价值,需要的朋友可以参考下

    Java的Object类讲解案例代码 equals()、hashCode()、finalize()、clone()、wait()

    通过该案例代码,你可以学习如何在自己的类中正确重写equals()、hashCode()、toString()等方法,提高代码质量和可读性。 经验丰富的Java开发者:即使你已经有一定的Java开发经验,仍然值得深入了解Object类的使用。...

    Java面试题.docx

    1、java中==和equals和hashCode的区别 2、int与integer的区别 3、String、StringBuffer、StringBuilder区别 4、什么是内部类?内部类的作用 5、进程和线程的区别 6、final,finally,finalize的区别 7、...

    Java hashCode() 方法详细解读

    Java.lang.Object 有一个hashCode()和一个equals()方法,这两个方法在软件设计中扮演着举足轻重的角色,本文对hashCode()方法深入理解,希望能帮助大家

    Java实例高难度面试题及解析 - 展现你的编程实力!

    在面试中,Java实例是考察面试者对面向对象编程和Java语言特性的理解能力的重要方面。通过这些高难度问题,您将全面掌握实例的创建、访问、拷贝、生命周期管理以及相关设计模式和技巧。 每个问题都包含了精确而深入...

    AIC的Java课程1-6章

    第3章 面向过程(数组和方法) 4课时  理解如何声明数组、构造数组、初始化数组以及使用数组中的各个元素。  清楚数组作为对象处理,创建数组对象时指定数组大小。  能够声明和操作多维数组...

    涵盖了90%以上的面试题

    同一个.java文件中是否可以有多个main方法 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 如何在main方法执行前输出”hello world” java程序的初始化顺序 请说出作用域public,private,...

    JAVA基础课程讲义

    equals和hashcode方法 143  泛型 144 思考作业 145 上机作业 145 第八章 IO技术 146 为什么需要学习IO技术 146 基本概念 146 数据源 146 流的概念 146 第一个简单的IO流程序及深入(将文件中的数据读入) 146 Java...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    安卓java读取网页源码-AndroidInterview:Android面试常见问题

    java中==和equals和hashCode的区别 == 在用关系操作符 == 比较的是值本身;equals 比较两个对象的引用是否相等,即 是否指向同一个对象;hashCode 用来鉴定两个对象是否相等,Object类中的hashCode方法返回对象在内存...

    安卓java读取网页源码-questions:自问自答

    说下你对抽象类和接口的理解,以及两者的相同点和不同点 父类的静态方法能否被子类重写 描述下类的加载机制 说说你对 Java 反射的理解 什么是动态代理 在 Java 中 wait、yield 和 seelp 方法的不同 描述下 Java 中的...

    疯狂JAVA讲义

    学生提问:hashCode方法对于HashSet的作用是什么? 249 7.3.2 TreeSet类 252 7.3.3 EnumSet类 259 7.4 List接口 261 7.4.1 List接口和ListIterator接口 261 7.4.2 ArrayList和Vector实现类 264 7.4.3 固定长度...

    Java核心技术II(第8版)

    11.1.4 调用脚本的函数和方法 11.1.5 编译脚本 11.1.6 一个示例:用脚本处理GUI事件 11.2 编译器API 11.2.1 编译便捷之法 11.2.2 使用编译工具 11.2.3 一个示例:动态Java代码生成 11.3 使用注解 11.3.1 一个示例:...

    8张图理解Java

     2、equals()方法、hashCode()方法的区别  HashCode被设计用来提高性能。equals()方法与hashCode()方法的区别在于:  如果两个对象相等(equal),那么他们一定有相同的哈希值。  如果两个对象的哈希值相同,...

    Java Object 类高难度进阶版面试题集锦解析Java Object类高难度面试题及答案解析

    提供了20道高难度的Java Object类面试题及详细答案解析,涵盖了equals()、hashCode()、toString()、clone()、finalize()等方法的重写和应用,以及对象的比较、克隆、标识哈希码等概念。适合准备Java面试的开发者深入...

    程序员需要经常刷题吗-simple-java-zh-CN:SimpleJava是Java常见问题的集合。中文翻译

    hashCode() 和 equals() 之间的契约 Java是按引用还是按值传递对象? 迭代与递归 ##3。 类和接口 什么是实例初始化器? 字段不能被覆盖? 继承与组合 如何使用 Java 枚举? 有多少种内部类? 什么是内部接口? 子类...

    大华股份java笔试题-interviewer:面试官

    大华股份java笔试题 第一章 内容介绍 第二章 JavaSE 基础 一、 Java 面向对象 面向对象都有哪些特性以及你对这些特性的理解 访问权限修饰符 public、private、protected, 以及不写(默认)时的区别(2017-11-12) 如何...

Global site tag (gtag.js) - Google Analytics