一、 hashCode

1 基本概念

hashCode 是 JDK 根据对象的地址算出来的一个 int 数字(对象的哈希码值),代表了该对象再内存中的存储位置。

hashCode() 方法是超级类 Object类 提供的一个方法,所有类都可以对该方法进行重写。

2、 为什么重写 hashCode()方法 要重写 equals()方法

hashCode() 相等是两个对象相等的必要非充分条件。
equals() 相等是两个对象相等的充要条件。

  重写 equals()方法 一定要重写 hashCode()方法 是为了提升效率,初步通过 hashCode() 判断是否相等,相等之后再通过 equals() 中的别的方式判断是否相等。

二、 equals()方法

  为保证程序健壮性,在重写 equals 方法时需满足以下情况:

1.自反性 : A.equals(A) 要返回 true。

2.对称性:如果 A.equals(B) 返回 true,则 B.equals(A) 也要返回 true。

3.传递性:如果 A.equals(B) 为 true,B.equals(C) 为 true,则 A.equals(C) 也要为 true, 相 当于如果 A = B, B = C ,那么 A = C。

4.一致性:只要 A、B 对象的状态没有改变,A.equals(B) 必须始终返回 true。

5.A.equals(null) 要返回 false。

三、 实例

  设计一个类Person 含有 height、weight、age 和 blood 是整数属性,实现 hashcode 方法,将四个属性编排到一个整数中作为 hashCode() 和 equals()方法。

public class Person {

public int height;

public int weight;

public int age;

public int blood;

public int getHeight() {

return height;

}

public void setHeight(int height) {

this.height = height;

}

public int getWeight() {

return weight;

}

public void setWeight(int weight) {

this.weight = weight;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public int getBlood() {

return blood;

}

public void setBlood(int blood) {

this.blood = blood;

}

public Person(int height, int weight, int age, int blood) {

this.height = height;

this.weight = weight;

this.age = age;

this.blood = blood;

}

public boolean equals(Object o) {

if(this.hashCode() == o.hashCode()){

return true;

}

return false;

}

public int hashCode() {

int i = (height << 24 & 0xff) | (weight << 16 & 0xff) | (age << 8 & 0xff) | blood;

return i;

}

public static void main(String[] args) {

Person p1 = new Person(1, 2, 3, 5);

Person p2 = new Person(1, 3, 3, 4);

System.out.println(p1.equals(p2));

}

}

Java重写hashcode()与equals()方法相关推荐

  1. 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写 hashcode 和 equals 方法?...

    1. 通过Hash算法来了解HashMap对象的高效性 2. 为什么要重写equals和hashCode方法 3. 对面试问题的说明 <Java 2019 超神之路> <Dubbo ...

  2. 为什么要重写 hashcode 和 equals 方法?

    我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分,有 ...

  3. 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写hashcode和equals方法?你能说清楚了吗...

    我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分,有 ...

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

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

  5. HashMap存储自定义类型键值: 重写HashCode和equals方法

    一个团体作为一个HashMap的key值,若团体成员的姓名年龄相同,则看作key值相同 因为是自定义类,所以需要重写HashCode和equals方法 public class RedVelvet { ...

  6. HashMap存自定义对象为什么要重写 hashcode 和 equals 方法?

    HashMap的k放过自定义对象么? 当我们把自定义对象存入HashMap中时,如果不重写hashcode和equals这两个方法,会得不到预期的结果. class Key{private Integ ...

  7. Hibernate中用到联合主键的使用方法,为何要序列化,为何要重写hashcode 和 equals 方法...

    联合主键用Hibernate注解映射方式主要有三种: 第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为 ...

  8. 重写hashcode和equals方法

    一.前言 我们都知道,要比较两个对象是否相等时需要调用对象的equals()方法,即判断对象引用所指向的对象地址是否相等,对象地址相等时,那么与对象相关的对象句柄.对象头.对象实例数据.对象类型数据等 ...

  9. java集合框架(hashSet自定义元素是否相同,重写hashCode和equals方法)

    /*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不一致,元素不可以重复 * (通过哈希值来判断是否是同一个对象) * ----HashSet:底层数据结构是哈希表, * 保证 ...

最新文章

  1. 利用python爬取IP地址归属地等信息!
  2. 【Android 逆向】ELF 文件格式 ( ELF 程序头入口大小 | ELF 程序头入口个数 | ELF 文件节区头入口大小 | ELF 文件节区头入口个数 | 字符表序号 )
  3. 使用C++访问MySQL数据库(VS2019)
  4. Vision Transformer 论文
  5. Div+CSS 布局
  6. 对通用输入输出GPIO的深入理解
  7. python多线程多进程
  8. 2019-03-28 SQL Server Pivot
  9. MyBatisPlus_查询分页篇_入门试炼_02
  10. moodle3.7中文语言包
  11. [perl]perl界大牛唐凤传说
  12. [BZOJ3245]最快路线
  13. (转)WP7 开发学习(2):在WP7中使用网络请求
  14. Tomcat 基于域名的虚拟主机设置
  15. c语言按键实现跳转程序,C语言中的跳转语句
  16. java伪代码生成器_java伪代码怎么写
  17. 开源版权 项目 字体
  18. 三星note8android 9.0,三星S9/S9+计划明天推送安卓9.0正式版、S8/S8+、Note8下周推测试版...
  19. 漏洞分析检测的主要技术
  20. 问卷调查:自定义表单设计vue

热门文章

  1. 小米游戏电视ES Pro 90 评测
  2. 【阿不】深入ASP.NET数据绑定(下)—多样的绑定方式
  3. YUV420转YUV444
  4. win10系统如何解决管理员已阻止你运行此应用
  5. java俄罗斯方块ppt_基于Java俄罗斯方块游戏设计与开发PPT.ppt
  6. 外汇交易中的风险管理
  7. MySQL 最左前缀原则
  8. 有个秋招拿到阿里offer的学生分享了整个面试流程
  9. c语言 链表建立头插法尾插法,单链表的创建(头插法和尾插法)
  10. Eclipse不停build workspace