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 ...
随机推荐
- PTA (Advanced Level) 1004 Counting Leaves
Counting Leaves A family hierarchy is usually presented by a pedigree tree. Your job is to count tho ...
- SQL Server复制入门(二)----复制的几种模式
简介 本系列文章的上一篇对复制是什么做了一个概述.本篇文章根据发布服务器,分发服务器和订阅服务器的组织方式和复制类型来讲述常用复制的几种模式. 模式的选择 选择复制的模式取决于多个方面.首先需要考虑具 ...
- (转).net平台下垃圾回收机制
引言:使用c++进行编程,内存的处理绝对是让每个程序设计者最头疼的一块了.但是对于.net平台下使用c#语言开发系统,内存管理可以说已经不算是问题了.在.net平台下CLR负责管理内存,CLR中的垃圾 ...
- java.lang.IllegalStateException: Restarter has not been initialized
在IDEA导入devtools依赖实现热布署,启动后遇到如下问题 java.lang.IllegalStateException: Restarter has not been initialized ...
- 哈密顿绕行世界问题(hdu2181)
哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【 js 基础 】【读书笔记】作用域和闭包
一.编译过程 常见编译性语言,在程序代码执行之前会经历三个步骤,称为编译. 步骤一:分词或者词法分析 将由字符组成的字符串分解成有意义的代码块,这些代码块被称为词法单元. 例子: var a = 2 ...
- JS 为什么在涉及到模块开发this的时候使用类似 self = this 的形式 p7
JS 动态作用域(调用栈)实际上也没有准确说明的,大多数我们使用对多和认知上大多是词法作用域,但是this的机制跟动态作用域很像. var a = 2; function fn(){ console. ...
- stylus常用写法
带参数 border-radius(val) -webkit-border-radius: val -moz-border-radius: val border-radius: val button ...
- Expo大作战(十九)--expo打包后,发布分用程序到商店的注意事项
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- [Android] 旋转照片/图片
今天比较闲(是任务做完了,不是偷懒),就多更新几篇,补一下之前做的东西. 原文地址请保留http://www.cnblogs.com/rossoneri/p/3995306.html 推荐阅读: An ...