1. hashCode

  1.1 基本概念

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

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

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

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

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


2. 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

3. 练习

  设计一个类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;
} @Override
public boolean equals(Object o) { if(this.hashCode() == o.hashCode()){
return true;
}
return false;
} @Override
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. 为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。

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

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

    作者丨hsm_computer cnblogs.com/JavaArchitect/p/10474448.html 我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候 ...

  3. HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法

    之前一直不是很理解为什么要重写HashCode和Equals方法,才只能作为键值存储在HashMap中.通过下文,可以一探究竟. 首先,如果我们直接用以下的Person类作为键,存入HashMap中, ...

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

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

  5. 重写hashcode和equals方法

    重写hashcode和equals方法 简乐君 2019-05-07 21:55:43 35481 收藏 191分类专栏: Java 文章标签: equals() hashcode()版权 一.前言我 ...

  6. 【java编程】重写HashCode和equals方法

    [一]重写equals方案的规则 equals方法本来的原则 1.类的每个实例本质上都是唯一的. 2.不关心类是否提供了“逻辑相等”的测试功能 3.超类已经覆盖了equals,从超类继承过来的行为对于 ...

  7. 【转】 如何重写hashCode()和equals()方法

    转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...

  8. 如何重写hashCode()和equals()方法

    hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equal ...

  9. Java 重写hashCode()与equals()

    为什么要重写hashCode() 和 equals() equals() 默认的Object类里面equals()方法是根据对象所在的内存来做判断的,如果两个对象引用指向的是同一个内存,则返回true ...

随机推荐

  1. 超详细的Java时间工具类

    package com.td.util; import java.sql.Timestamp; import java.text.ParseException; import java.text.Pa ...

  2. 跨站点请求伪造(CSRF)

    一.前言 跨站点请求伪造(Cross-SiteRequest Forgeries, CSRF),是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动 ...

  3. POJ 1258 Agri-Net(Prim算法求解MST)

    题目链接: http://poj.org/problem?id=1258 Description Farmer John has been elected mayor of his town! One ...

  4. ConcurrentHashMap 扩容分析拾遗

    前言 这是一篇对 transfer 方法的拾遗,关于之前那篇文章的一些一笔带过,或者当时不知道的地方进行回顾. 疑点 1. 为什么将链表拆成两份的时候,0 在低位,1 在高位? 回顾一下 transf ...

  5. ImageButton设置src图片大小

    需求&起因 有时候没有找到合适大小的资源,需要修改图片大小而且不改变ImageButton的大小.可以通过缩放图片大小的方式改变外观. ImageView的属性android:scaleTyp ...

  6. [日常] Go语言圣经-竞争条件习题

    package main import( "fmt" "sync" ) var balance int func Deposit(amount int) { b ...

  7. 【Spring】2、BeanFactory 和FactoryBean的区别

    转自:http://chenzehe.iteye.com/blog/1481476 1. BeanFactory BeanFactory定义了 IOC 容器的最基本形式,并提供了 IOC 容器应遵守的 ...

  8. 【Java基础】7、Java同步机制之Monitor监视器与syncrhoized实现原理

    一:Monitor Monitor是一个同步工具,相当于操作系统中的互斥量(mutex),即值为1的信号量. 它内置与每一个Object对象中,相当于一个许可证.拿到许可证即可以进行操作,没有拿到则需 ...

  9. Fibonacci (hdu1568)数学公式

    Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  10. while和if的区别

    while用于循环语句,而if用于判断和分支语句.由于你并没有指明是什么程序,只能泛泛而谈了.if 语句中,常用格式为:if(判断条件){执行语句}上面的结构,只是进行一次判断.if与else结合,就 ...