java hashCode() 和 equals() 方法的重要性?如何在Java中使用它们
时间:2018-11-14
本文章向大家介绍java hashCode() 和 equals() 方法的重要性?如何在Java中使用它们,需要的朋友可以参考一下
Java中的HashMap使用 hashCode()和equals()方法 来确定键值对的索引, 当根据键获取值的时候 也会用到这两个方法。 如果没有正确的实现这两个方法, 两个不同的键可能会有相同的hash值, 因此可能会被集合认为是相等的。 而且,这两个方法也用来发现重复元素, 所以这两个方法的实现对HashMap的 精确性和正确性是至关重要的。 同一个对象(没有发生过修改) 无论何时调用hashCode(), 得到的返回值必须一样。 hashCode()返回值相等, 对象不一定相等, 通过hashCode()和equals() 必须能唯一确定一个对象。 一旦重写了equals(), 就必须重写hashCode()。 而且hashCode()生成哈希值的依据应该是 equals()中用来比较是否相等的字段。 如果两个由equals()规定相等的对象 生成的hashCode不等, 对于HashMap来说, 他们可能分别映射到不同位置, 没有调用equals()比较是否相等的机会, 两个实际上相等的对象可能被插入到不同位置, 出现错误。 其他一些基于哈希方法的集合类 可能也会有这个问题。 ---------------- 怎么判断两个对象是相同的? 使用等号== 判断两个对象是否相同, 这种是严格的相同, 即内存中的同一个对象 Object的equal方法就是使用==判断两个对象是否相同 ------------ 集合set要求元素是唯一的,怎么实现? 要实现元素的唯一, 需要在往集合set中添加元素时, 判断集合set是否存在相同的元素, 如果存在,则不添加,反之。 那么怎么确定两个元素是否相同, 1.如果是使用等号==判断两个元素是否相同, 即默认使用Object的equals的方法。 2.如果没有使用等号==判断两个元素是否相同, 而是按照某种业务规则判断两个元素是否相同, 即重写了Object的equals的方法。 ---------------------- 当重写equals方法,必须重写hashCode方法吗? 不是必须的, 得看具体的情况 当equals方法返回的结果和使用等号 比较的结果是一致的时候, 是没有必要重写hashCode方法。 当用等号比较对象, 只有是内存中同一个对象实例, 才会返回true, 当然调用其hashCode()方法 肯定返回相同的值, 这满足了满足了hashCode的约束条件, 所以不用重写hashCode()方法。 当equals方法返回的结果 和使用等号比较的结果是不一致的时候, 就需要重写hashCode方法。 当重写后的equals方法 不认为只有是在内存中同一个对象实例, 才返回true, 如果不重新hashCode方法() Object的hashCode()方法 是对内存地址的映射, hashCode方法返回的值肯定是不同的, 这违背了hashCode的约束条件, 所以必须要重新hashCode方法, 并满足对hashCode的约束条件。
- Hadoop数据分析平台实战——040HDFS介绍(熟悉基础概念跳过)离线数据分析平台实战——040HDFS&JAVA API(熟悉基础概念跳过)
- Hadoop数据分析平台实战——060深入理解MapReduce 01(案例)离线数据分析平台实战——060深入理解MapReduce 01(案例)
- 利用向量积(叉积)计算三角形的面积和多边形的面积
- HDU 1556 Color the ball
- Hadoop数据分析平台实战——080HBase介绍和安装离线数据分析平台实战——080HBase介绍和安装
- Hadoop数据分析平台实战——130Hive Shell命令介绍 02(熟悉Hive略过)离线数据分析平台实战——130Hive Shell命令介绍 02(熟悉Hive略过)
- ECJTUACM16 Winter vacation training #4 题解&源码
- Hadoop数据分析平台实战——090HBase shell客户端和Java Api介绍离线数据分析平台实战——090HBase shell客户端和Java Api介绍
- Hadoop数据分析平台实战——140Hive函数以及自定义函数讲解离线数据分析平台实战——140Hive函数以及自定义函数讲解
- 深入理解树状数组
- Codeforces 712C Memory and De-Evolution
- Codeforces 712B Memory and Trident
- Hadoop数据分析平台实战——110Hive介绍和Hive环境搭建离线数据分析平台实战——110Hive介绍和Hive环境搭建
- 干货|普通反爬虫机制的应对策略
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释