正确重写hashcode hashcode与equals方法 集合元素如何判断是否相等 集合如何查看是否包含某个元素
首先记住两句话
相等的两个对象,即equals(Object)方法判断两个对象相等,那么他们必须要有相同的hashcode
hashcode相同的两个对象,他们可能相同,也可能不相同
简单地说可以这么理解,hashcode是java实现中经常用到的比如在HashMap HashSet,根据hashcode不等就可以断定两个对象不等,如果相等再去比较equals,大大减少了equals的调用次数,效率就高很多了
原理搜一下有很多文章,不再多说
重点说一下应用,大家或许看到很多地方说:
重写equals方法要同步重写hashcode,具体的怎么写却不知道
接下来就主要说一下,具体的怎么实现(小白围观,老鸟勿扰)
其实开场的两句话也是这个意思
场景:
当你需要实现你自己的对象上的逻辑相等时,需要重写equals方法
比如一个学生类
name,age,sex,class…等多重属性
假设就是public student{ //这么一个类
name
age
sex
class
}
(简写一下,不要较真…)
用自然语言说的话,就是姓名,性别,年龄,班级一样,在这个类上的话,我们就可以认为两个对象是相等的了
对吧
换成java语言就是
public boolean equals(Object obj) { if (obj instanceof Student) {
Student student= (Student ) obj;
if(this.name.equals(student.name) && this.age.equals(student.age)
&&this.sex.equals(student.sex)&&this.class.equals(student.class) ){ return true;
}
else{
return false;
}
//非该类实例,直接返回false
} else{ return false;
} }
很简单,比较相等,至少得是学生..不是直接返回false
如果是学生实例,就比较一下,姓名年龄性别班级,都相等了就是相等了
怎么保障重写equals方法后,这两个对象实例的hashcode也是一样的呢?
所有的hashcode都返回一样的值?答案是可以的在某些情况下,但是某些情况下你就要悲剧了,所以当然不要
常用的办法是用:判断相等的条件 用到的属性 来重写
直白点就是:利用刚才使用到的姓名 性别 年龄 班级 这几个属性的值来重写hashcode
使用它们的组合方式
可以使用这样子的形式
a1*属性1的int形式+a2 属性2的int形式+….
a为系数
所谓属性的int形式,大家要知道hashcode都是数值
这样子才能保障最后的结果也是一个int值,简单就这么理解吧
而且还有就是比如string已经有了他自己的hashcode实现了,可以直接调用的
比如我们的例子
我们可以这样子
public int hashCode() {
// TODO Auto-generated method stub
//根据判断是否相等的属性,来重写hashCode
return ( this.name.hashCode() + this.sex.hashCode()+age+this.class.hashcode() ); }
系数可以随便,你甚至都可以用this.name.hashCode() *age
形式上可以变化多端
但是要注意几个条件就好了
1,相同的对象的hashcode肯定是相同的
2,最后生成的结果不能大于int的取值范围
3,尽可能的科学保证不是随随便便的一个对象hashcode都相等
友情提示:
[1]. HashSet判断、删除和添加元素等操作依据的是被操作元素所在的类的hashCode()和equals( )这两个方法。
[2]. ArrayList做同等的操作,依据的仅仅是equals( )方法
正确重写hashcode hashcode与equals方法 集合元素如何判断是否相等 集合如何查看是否包含某个元素的更多相关文章
- 为什么要重写hashCode()方法和equals()方法及如何重写
我想写的问题有三个: 1.首先我们为什么需要重写hashCode()方法和equals()方法 2.在什么情况下需要重写hashCode()方法和equals()方法 3.如何重写这两个方法 **** ...
- 为什么要重写hashcode方法和equals方法
我们可能经常听到说重写equals方法必须重写hashcode方法,这是为什么呢?java中所有的类都是Object的子类,直接上object源码 /* * Copyright (c) 1994, 2 ...
- java 集合 HashSet 实现随机双色球 HashSet addAll() 实现去重后合并 HashSet对象去重 复写 HashCode()方法和equals方法 ArrayList去重
package com.swift.lianxi; import java.util.HashSet; import java.util.Random; /*训练知识点:HashSet 训练描述 双色 ...
- hashCode()方法和equals方法的重要性。
在Object中有两个重要的方法:hashCode()和equals(Object obj)方法,并且当你按ctrl+alt+s时会有Generator hashCode()和equals().我们不 ...
- Java的equals方法,首先要判断类型是否相同
如下代码,Long 和Integer 进行比较: Integer aa = 1; Long bb= 1L; System.out.println(aa.equals(bb)); 输出为:false 查 ...
- Java 重写hashCode 方法和equals方法
package Container; import java.util.HashSet; import java.util.Iterator; /* Set 元素是无序的(存入和取出的顺序不一定一致) ...
- hashCode方法和equals方法比较
为什么用HashCode比较比用equals方法比较要快呢?我们要想比较hashCode与equals的性能,得先了解HashCode是什么. HashCode HashCode是jdk根据对象的地址 ...
- 如何重写Java中的equals方法
Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型, ...
- 重写Object类里equals方法
package com.fff; public class Pet { private String name; private int age; public Pet(String nume,int ...
随机推荐
- 组件内守卫beforeRouteEnter和beforeRouteLeave
beforeRouteEnter用法和其他守卫差不多. 有个注意的地方就是beforeRouteEnter不能用this获取组件内收据. 在next()方法内存入vm这个参数,获取组件内数据. bef ...
- linux 解压 压缩 常见命令
压缩命令: .tar tar -cvf 文件名称.tar 文件或者文件夹 .tar.gz tar -zcvf 文件名称.tar.gz 文件或者文件夹 .tar.xz tar -Jcf 文件名称.tar ...
- 记录做一个类似于探探的卡片式布局的Recycleview有数据一直不显示
使用了别人的项目 https://github.com/JerryChan123/ReSwipeCard/blob/master/README_zh.md 之前找recycleview有数据不显示的原 ...
- Postman SMTP 存在跨站脚本(XSS)漏洞,请换用Post SMTP Mailer/Email Log
Postman SMTP 是一个安装量超过10W的WordPress插件,但是已经2年多没有更新,2017年6月29日,被发现存在跨站脚本(XSS)漏洞(查看详情),并且作者一直没有更新,所以被从Wo ...
- Python爬虫的学习经历
在准备学习人工智能之前呢,我看了一下大体的学习纲领.发现排在前面的是PYTHON的基础知识和爬虫相关的知识,再者就是相关的数学算法与金融分析.不过想来也是,如果想进行大量的数据运算与分析,宏大的基础数 ...
- tarjan算法总结
部分内容引自https://www.cnblogs.com/stxy-ferryman/p/7779347.html Tarjan算法不是一个算法而是一类算法 1.求取强连通分量 强连通分量————有 ...
- Codeforces Round #421 (Div. 2)
A: 题意:给你一本书共c页,第一天看v0页,第二天看v0+a,第二天看v0+2a以此类推,每天最多看v1页,但是后一天要重复看前一天的后l页. 代码: #include<stdio.h> ...
- 无法从项目中获取SSIS包的列表
一直做的SSIS项目,突然在生成项目的时候没有反应,crtl + alt +o 提示:无法从项目中获取SSIS包的列表,发现是最近的包没有设计数据源, 解决思路:检查最近的包,挨个运行一遍,看看有没有 ...
- 包建强的培训课程(2):Android与设计模式
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- ZJOI2019二试游记
ZJOI2019二试游记 Day -2 今天就要去被虐了!开一篇占个坑.禁赛警告 Day -1 早上zzy,下午zzq,无限懵逼... 过来的时候Sooke,memset0,老K坐我旁边,瑟瑟发抖.. ...