Java 重写 hashCode() 和 equals() 方法
1. hashCode
1.1 基本概念
hashCode 是 JDK 根据对象的地址算出来的一个 int 数字(对象的哈希码值),代表了该对象再内存中的存储位置。
hashCode() 方法是超级类 Object类 提供的一个方法,所有类都可以对该方法进行重写。
1.2 为什么重写 equals()方法 要重写 hashCode()方法
hashCode() 相等是两个对象相等的必要非充分条件。
equals() 相等是两个对象相等的充要条件。
重写 equals()方法 一定要重写 hashCode()方法 是为了提升效率,初步通过 hashCode() 判断是否相等,相等之后再通过 equals() 中的别的方式判断是否相等。
2. equals()方法
为保证程序健壮性,在重写 equals 方法时需满足以下情况:
- 自反性 : A.equals(A) 要返回 true
- 对称性:如果 A.equals(B) 返回 true,则 B.equals(A) 也要返回 true
- 传递性:如果 A.equals(B) 为 true,B.equals(C) 为 true,则 A.equals(C) 也要为 true, 相当于如果 A = B, B = C ,那么 A = C
- 一致性:只要 A、B 对象的状态没有改变,A.equals(B) 必须始终返回 true
- 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() 方法的更多相关文章
- 为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。
我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...
- (转)为什么要重写 hashcode 和 equals 方法?
作者丨hsm_computer cnblogs.com/JavaArchitect/p/10474448.html 我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候 ...
- HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法
之前一直不是很理解为什么要重写HashCode和Equals方法,才只能作为键值存储在HashMap中.通过下文,可以一探究竟. 首先,如果我们直接用以下的Person类作为键,存入HashMap中, ...
- 为什么要重写hashcode和equals方法
我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...
- 重写hashcode和equals方法
重写hashcode和equals方法 简乐君 2019-05-07 21:55:43 35481 收藏 191分类专栏: Java 文章标签: equals() hashcode()版权 一.前言我 ...
- 【java编程】重写HashCode和equals方法
[一]重写equals方案的规则 equals方法本来的原则 1.类的每个实例本质上都是唯一的. 2.不关心类是否提供了“逻辑相等”的测试功能 3.超类已经覆盖了equals,从超类继承过来的行为对于 ...
- 【转】 如何重写hashCode()和equals()方法
转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...
- 如何重写hashCode()和equals()方法
hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equal ...
- Java 重写hashCode()与equals()
为什么要重写hashCode() 和 equals() equals() 默认的Object类里面equals()方法是根据对象所在的内存来做判断的,如果两个对象引用指向的是同一个内存,则返回true ...
随机推荐
- angular ng-repeat点击切换样式,浅谈track by $index
前言 angular ng-repeat点击切换样式,ng-repeat点击切换class样式,巧用ng-repeat track by $index. 1.问题 一个ul包含多个li,li通过ng- ...
- [转]史上最佳 Mac+PhpStorm+XAMPP+Xdebug 集成开发和断点调试环境的配置
本文转自:https://www.cnblogs.com/lishiyun19/p/4470086.html 在上一篇 PHP 系列的文章<PHP 集成开发环境比较>中,我根据自己的亲身体 ...
- [Angularjs]cookie操作
摘要 现在很多app采用内嵌h5的方式进行开发,有些数据会存在webveiw的cookie中,那么如果使用angularjs开发单页应用,就需要用到angularjs的cookie操作.这里提供一个简 ...
- RadioButtonList根据值触发OnSelectedIndexChanged事件
Insus.NET有使用Iframe来处理另外一个站点的enter form,由于需要自动循环填入数据,免去人手操作.但是原来的Enter from有RadioButtonList控件以及OnSele ...
- Visual Studio 监视与快速监视即时窗口没有智能提示
工具->选项->文本编辑器->C# 将 自动列出成员 参数信息 都勾选上
- .netcore使用vscode多项目调试
开发环境:windows 编辑器: Visual Studio Code 环境安装: .Net Core 1.1 SDK https://www.microsoft.com/net/co ...
- PowerDesigner 创建表格及导出SQL语句
PowerDesigner 创建表格及导出SQL语句 目的:提高数据库创建表格效率 测试数据库:orcale 1.新建物理模型. 右键点击workplace,new一个物理模型并指定数据库. 2. ...
- 当堆遇到STL 代码焕发光芒
来自度娘的释义,堆的含义大概是这样的: 感性理解: 堆(英语:heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: 堆中某个节点的值总是不大于 ...
- call,apply,bind
var student={ name:"马云", say:function(){ console.log(this.name); } } var f=student.say; f. ...
- Linux常用基本命令( tree, pwd, cd )
pwd与cd命令 >pwd命令是“print working directory”中每个单词的首字母缩写,其功能是显示当前工作目录的绝对路径.在实际工作中,我们在命令行操作命令时,经常会在各个目 ...