在重写一个类的equals()的同时,一般要重写hashCode()除非你确认类的对象不会放入HashSet,HashTable,HashMap。
那么为什么要重写hashCode()呢?主要是为了确保hash表里面不会被放入重复的对象,以提高性能。那为什么重写了hashCode()就可以做到这一点呢?下面以一段代码分析。
/**Strudent重写了equals和hashCode,这里假设只要学号相等则是同一个对象。
先看看hashCode()返回相同的值:0的情况。
*/
public class Student {
public Student(String no) {
this.no = no;
}
//永远都返回0
@Override
public int hashCode() {
System.out.println("call hashcode");
return 0;
}
// 这里的equals实现学号相同表示相等
@Override
public boolean equals(Object obj) {
System.out.println("call equals");
if (this == obj)
return true;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (no == null) {
if (other.no != null)
return false;
} else if (!no.equals(other.no))
return false;
return true;
}
// 学号,假设必须唯一
private String no;
private String name;
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Set<Student> set = new HashSet<Student>();
set.add(new Student("1"));
System.out.println("----------");
set.add(new Student("2"));
System.out.println("----------");
set.add(new Student("3"));
System.out.println("----------");
System.out.println(set.size());
}
}
我们看看输出结果:
call hashcode
----------
call hashcode
call equals
----------
call hashcode
call equals
call equals
----------
3
看到了吗?呵呵,就是每次在往Set里add(object)时,先调用hashCode(),若hash码与set里面某个object的hash码不相等,则直接放入set;否则调用equals(object),若与set中某个object相等(即hashCode相等,而且equals返回true),则返回,不放入set,否则放入set。
再来看看这样重写hashCode时的结果:
//这里返回学号的hashCode。
@Override
public int hashCode() {
System.out.println("call hashcode");
return no.hashCode();
}
再运行一下,结果如下:
call hashcode
----------
call hashcode
----------
call hashcode
----------
3
也就是说学号不同(各个object的hashCode不同),直接放入Set,没有执行equals。
总结:重写equals的时候,一般要重写hashCode,并尽量保证不同object的hashCode不同,以提高hash的性能。
分享到:
相关推荐
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
重写equals和hashcode方法,学习和进步
关于重写equals,hashcode以及compareTo方法!
为什么重写equals方法,还必须要重写hashcode方法
主要介绍了重写hashCode()和equals()方法详细介绍,涉及重写equals()方法,重写hashCode()方法,重写equals()而不重写hashCode()的风险等相关内容的介绍,具有一定借鉴价值,需要的朋友可以参考下
面试官瞬间就饱了,重写equals函数,需要重写hashCode函数吗? 面试官问我,为什么重写equals函数,必须重写hashCode函数,我当时就懵住了。 然后扯天扯地,然后面试官瞬间就饱了,痛定思痛,写下这篇博客 首先看...
NULL 博文链接:https://zpointer.iteye.com/blog/1058337
4、重写equals()方法5、为什么要重写hashCode()方法?6、什么时候需要重写hashCode()方法?7、重写hashCode()方法: 1、hashCode与equals两者之间的关系 如果两个对象相同(即用equals比较返回true),那么它们的...
首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法
主要给大家介绍了关于java中为什么重写equals时必须重写hashCode方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
下面小编就为大家带来一篇java中重写equals()方法的同时要重写hashcode()方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了Java重写equals及hashcode方法流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Object 类是所有类的父类,其 equals 方法比较的是两个对象的引用指向的地址,hashcode 是一个本地方法,返回的是对象地址值。他们都是通过比较地址来比较对象是否相等的
主要介绍了java中重写equals和重写hashCode()的相关资料,需要的朋友可以参考下
NULL 博文链接:https://alpha2009.iteye.com/blog/570322
java 序列化和重写 hashCode 以及 equals 方法的例子
首先我们看下下面代码及输出和String重写equals和hashcode的源码: package com.zzy.test; public class Test6 { public static void main(String[] args) { String s1="aaa"; String s2="aaa"; String s3=new ...
主要介绍了如何在IDEA中对 hashCode()和 equals() 利用快捷键快速进行方法重写,需要的朋友可以参考下
1、何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。 2、为什么改写equals()的时候,总是要改写hashCode() 两个原则: hashCode()的返回值和equals()的关系...
但是为什么JavaDoc明确的告诉我们, hashCode()和equals()要一起重写呢?原因是因为,在Java自带的容器HashMap和HashSet中, 都需同时要用到对象的hashCode()和equals()方法来进行判断,然后再插入删除元素,这点...