java中equals与hashCode的重写问题
这几天有一个朋友问我在重写equals和hashCode上出现了问题,最后我帮她解决了问题,同时也整理出来分享给大家
现上Object的equals与HashCode的代码
public boolean equals(Object obj) {
return (this == obj);
}
public native int hashCode();
由上面可以看到Object的equlas方法等价于“==”,所以不能满足我们平时的需求,因此我们需要重写equals,在java中我们约定了重写equals的时候也要重写HashCode方法,可以参考String的equals与HashCode的方法,ok。。。上代码
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
现在说说我对这两个方法的个人理解心得
我们可以把HashCode理解为词典中的索引比如“词语”,“词典”两个词,所以当HashCode相同时,equals不一定相同,反过来equals相同。HashCode就一定相等,总结就是 equals相等,hashcode一定相等,equals不相等,hashcode不一定不相等(个人理解可能在某些问题上会有局限性)
下面是是我自己重写的一个equals与HashCode的方法,具体问题都标注在代码中了
public class Dog {
public String name;
public int age;
public Dog(String name,int age){
this.name=name;
this.age=age;
}
@Override
public boolean equals(Object obj) {
if(this==obj) return true;
/*第一个是通过比较地址来间接比较值的,毋庸置疑,如果地址是一样的话,那么值也是一样的。还有一点也能说明为什么是比较值而不是地址,
那就是第一个判断只有返回true而没有返回false。因为如果是false的话那么说明地址是不同的,但是地址不同并不能说值不同,所以没
有写返回false也说明了第一个是通过比较地址来间接比较值的,而不是只是简单的比较地址。*/
if(this==null||(this.getClass()!=obj.getClass())) return false;
/*if(!(obj instanceof Cat)) return false; 我在网上看到一些人这样写,这样写是不对的,当本类没有子类的时候可以,但是当本类
存在子类会导致一些问题,======>> a.equls(b) 返回true b.equals(a) 返回false*/
Dog dog=(Dog) obj;
return this.age==dog.age&&this.name.equals(dog.name);
}
@Override
public int hashCode() {
return name.hashCode()*37+age;
}
public static void main(String[] args) {
HashMap map=new HashMap();
Dog d1=new Dog("x",1);
Dog d2=new Dog("x",1);
map.put(d1, 1);
System.out.println(d1.equals(d2)); //=====>返回true
System.out.println(map.get(new Dog("x",1))); //=====>这里当补充些HashCode的时候的结果是null;只有在重写了HashCode才会出现结果"1"
}
}
java中equals与hashCode的重写问题的更多相关文章
- java中equals和hashCode方法随笔二
前几天看了篇关于java中equals和hashCode方法的解析 1.Object类中的equals方法和hashCode方法. Object类中的equals和hashCode方法简单明了,所有的 ...
- Java中equals和hashcode的区别?
Java中equals和hashcode方法是在Object对象中的,所以每个对象都有这两个方法,大多数时候我们为了实现特定需求需要重写这两个方法 equals和hashcode方法常用在同一个类中用 ...
- Java中equals()和hashCode()的关系以及重写equals()和hashCode()的重要性
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6580647.html 一:关系 如果两个对象相等(equal),它们的hashcode一定相同: 如果两个对 ...
- java中equals和hashCode方法的解析
解析Java对象的equals()和hashCode()的使用 前言 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个.在多 ...
- Java中equals,hashcode
在Java语言中,Object对象中包含一个equals和hashCode方法,其中hashCode方法是由JVM本地代码(native code)实现的,返回值是一个有符号的32位整数,对 ...
- Java 中equals和toString()方法重写
1,equals方法 (1)什么时候需要重写? 如果希望不同内存但相同内容的两个对象equals时返回true,则需要重写equals (2)怎么重写? class A { public int i; ...
- Java中equals,hashcode,==的区别
== :比较java栈局部变量表中变量的地址或值是否相等. equals : 比较变量的地址在java堆中引用对象是否为同一个对象. hashcode : 通过对象在JVM内存中的存储地址通过特定算 ...
- java中equals,hashcode和==的区别
https://www.cnblogs.com/kexianting/p/8508207.html
- java中equals相同,hashcode一定相同ma
一.jdk中equals和hashcode的定义和源码进行分析 1.java.lang.Object中对equals()方法的定义 java.lang.Object中对hashCode()方法的定义 ...
随机推荐
- 【CSP2019】括号树 题解(递推+链表)
前言:抽时间做了做这道题,把学长送退役的题. ----------------- 题目链接 题目大意:定义$()$是合法括号串.如果$A,B$是合法括号串,那么$(AB),AB$为合法括号串.现给定根 ...
- Android SQLite轻量级数据库(简单介绍)
SQLite它是相当于嵌入到安卓里的一个小数据库吧, 它也可以使用SQL语句进行数据库的增删改查操作,但是是SQL1992的语句. 然后SQLite也有自己的语句,但是学过SQL的应该都会发现,它比较 ...
- [深度学习] Pytorch学习(一)—— torch tensor
[深度学习] Pytorch学习(一)-- torch tensor 学习笔记 . 记录 分享 . 学习的代码环境:python3.6 torch1.3 vscode+jupyter扩展 #%% im ...
- Assembly.LoadFrom() 方法加载程序集,无法转换类型
有些情况在开发一个C#框架的时候,要用到反射加载另外程序集,这是必然考虑的事情.这样做的好处就是多个工程同时作业的时候,可以互不干扰,替换DLL文件即可. Assembly.Load();这个方法只能 ...
- C#设计模式之22-模板方法模式
模板方法模式(Template Method Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/429 访 ...
- C#算法设计排序篇之03-直接插入排序(附带动画演示程序)
直接插入排序(Straight Insertion Sort) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/679 访 ...
- 解读闭包,这次从ECMAScript词法环境,执行上下文说起
对于x年经验的前端仔来说,项目也做了好些个了,各个场景也接触过一些.但是假设真的要跟面试官敞开来撕原理,还是有点慌的.看到很多大神都在手撕各种框架原理还是有点羡慕他们的技术实力,羡慕不如行动,先踏踏实 ...
- java如何实现发送邮箱
package cn.buy.util; import java.security.GeneralSecurityException; import java.util.Properties; imp ...
- Linux内核之 内核同步
上文我们介绍过进程调度,Linux内核从2.6版本开始支持内核抢占,所以内核很多代码也需要同步保护. 一.同步介绍 1.临界区与竞争条件 所谓临界区(critical regions)就是访问和操作共 ...
- Windows Server2008RFTP隔离账户的搭建
Step1:添加用户 打开DOS命令, net user net user u1 123.com /add net user u2 123.com /add Step2:创建文件夹 Step3:修改用 ...