hashCode与equals深度剖析与源码详解
作者:访客发布时间:2023-12-28分类:程序开发学习浏览:88
hashCode与equals深度剖析与源码详解
[TOC]
1.Set特点
(1)元素无顺序 (2)元素不能有重复的。
2.Object类equals方法的特点
(1)自反:前提object不为空,x.equals(x)应该为true. (2)对称性:x.equals(y)为true,那么y.equals(x)也为true; (3)传递性:x.equals(y)为true,并且y.equals(z)为true,那么x.equals(z)也应该为true; (4)一致性:x.equals(y)为true,那么x.equals(y)的第二次,第三次,第n次调用也应该为true,前提是比较之间没有修改x也没有修改y. (5)对于非空引用x,x.equals(null)返回false;
2.1注意
(1)Object的equals()方法就是用==来比较的。 (2)当我们要Override equals()这个方法的时候,也要同时去Override hashcode()这个方法。
3.关于Object类hashCode方法的特点
(1)在java应用的一次执行过程当中,对于同一个对象的hashCode方法的多次调用,它们应该返回同样的值(前提是该对象的信息没有发生变化)。 (2)对于两个对象来说,如果使用equals方法比较返回true,那么这两个对象的hashCode值也一定是相同的。 (3)对于两个对象来说,如果使用equals方法比较返回false,那么这两个对象的hashCode不要求一定不同(可以相同,可以不同),但是如果不同则可以提高应用的性能。 (4)对于Object类来说,不同的Object 对象的hashCode值是不同的(Object类的hashCode值表示对象的地址)。
4.HashSet的调用过程
(1)当使用HashSet时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的hash code值是否与增加的对象的hashcode值一致,如果不一致,则直接加进去,如果一致再进行equals方法的比较,equals方法如果返回true,表示对象已经加进去了,就不会再增加新对象了,否则就加进去。
5.总结
(1)对于一个集合来说,判断一个对象到底能不能放到集合里面,这是通过hash code与equals方法来共同去完成的。
(2)如果对于我们自己的一个类,要想让它内容一样,比如说两个人,只要两个人名字一样,它的内容就一样,这个时候,两个张三就不要放在一个集合里面。
重写hashcode方法,重写equals方法,因为这两个方法都是Object类定义的,而且这两个方法又是密切相关的,所以在绝大多数情况下,我们只要重写了hashcode方法,我们就要同时重写equals方法。反过来也是一样的。重写了equals方法,也要重写hashcode方法。
(3)如果我们重写equals方法,那么也 要重写hashCode方法,反之亦然。
package com.javase.hashset;
import java.util.HashSet;
/**
* 不使用Object类提供的hashCode方法与equalse方法,
* 使用自己实现的hashCode方法与equals方法判断两个对象的内容是否相同
* 重写hashCode方法与equals方法
* @author x_xiongjie
*
*/
public class SetTest3 {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
HashSet set = new HashSet();
Student s1 = new Student("zhangsan");
Student s2 = new Student("zhangsan");
set.add(s1);
set.add(s2);
System.out.println(set);
}
}
class Student{
private String name;
public Student(String name){
this.name = name;
}
//借助于name的hash code来代表类本身的hash code.
@Override
public int hashCode() {
return this.name.hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj == this){
return true;
}
//如果obj不为空,并且是当前类的实例。
if(obj != null && obj instanceof Student){
Student s = (Student) obj;
if(name.equals(s.name)){
return true;
}
}
return false;
}
}
(1)在实际开发过程中,判断对象能不能放到集合里面,大多数情况下都是根据内容来决定的,而不是根据地址来决定的。
(2)实际实现的时候,hashCode与equals都是通过内容来实现的,这个内容来如何体现,就是通过类的成员变量去体现的,两个对象内容到底是不是一样,就是通过成员变更去体现的,数据表示对象的状态。 )实际实现的时候,hashCode与equals都是通过内容来实现的,这个内容来如何体现,就是通过类的成员变量去体现的,两个对象内容到底是不是一样,就是通过成员变更去体现的,数据表示对象的状态。
相关推荐
- 如何使用Google Analytics在WordPress中添加滚动深度跟踪
- 源码解析之OkHttp五大拦截器原理解析
- 如何在windows搭建Android系统源码学习环境
- 开机动画 BootAnimation 源码分析
- Android源码阅读:Handler机制
- Android 中的 ClassLoader 详解
- 安卓性能优化系列-腾讯矩阵-TracePlugin卡顿优化之ANR监控Loper AnrTracer源码分析
- 本教程将涵盖您需要了解的有关特色图片的所有信息——它们是什么,为什么要使用它们,以及如何在您的网站上启用它们。我们还将介绍一些插件来优化特色图像。
- WordPress内容组织主要依赖分类目录和标签目录,但刚接触WP的站长可能会对这两个概念会感到迷惑。实际上,根据小编多年的WordPress使用经验,你可笼统地将WordPress的分类理解为“武林各大门派”,将标签理解为“各大门派不同的特征”。
- rel="nofollow" 标签是html标签中使用比较广泛的一种,无论是站长还是SEO从业人员都应该对其十分熟悉。这个文章将会从多个方面带你深入了解Nofollow链接的相关知识。
- 程序开发学习排行
-
- 1鸿蒙HarmonyOS:Web组件网页白屏检测
- 2HTTPS协议是安全传输,为啥还要再加密?
- 3HarmonyOS鸿蒙应用开发——数据持久化Preferences
- 4记解决MaterialButton背景颜色与设置值不同
- 5鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)
- 6鸿蒙HarmonyOS实战-ArkUI组件(Stack)
- 7[Android][NDK][Cmake]一文搞懂Android项目中的Cmake
- 8Android广播如何解决Sending non-protected broadcast问题
- 9鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)
- 最近发表
-
- WooCommerce最好的WordPress常用插件下载博客插件模块的相关产品
- 羊驼机器人最好的WordPress常用插件下载博客插件模块
- IP信息记录器最好的WordPress常用插件下载博客插件模块
- Linkly for WooCommerce最好的WordPress常用插件下载博客插件模块
- 元素聚合器Forms最好的WordPress常用插件下载博客插件模块
- Promaker Chat 最好的WordPress通用插件下载 博客插件模块
- 自动更新发布日期最好的WordPress常用插件下载博客插件模块
- WordPress官方最好的获取回复WordPress常用插件下载博客插件模块
- Img to rss最好的wordpress常用插件下载博客插件模块
- WPMozo为Elementor最好的WordPress常用插件下载博客插件模块添加精简版