先读读网上这段话:
1,哈希算法:这种算法将集合分为若干个区域,每个对象可以计算出一个哈希码,可以讲哈希码分组,每组分别对应一个区域,根据一个对象的哈希码就可以确定这个对象存储在那个区域,从而大大提高了存储和读取兑取集合中对象的速度;
2,哈希集合:就是内部采用了哈希算法的集合,HashSet就是一种哈希集合。
3,只有类的实例对象要被采用哈希算法进行检索与存储时菜要求覆盖HashCode方法。当然提供一个hashcode方法即使对象不用到也不会有什么坏处;
4,注意:①一般来说两个对象equal方法相等时他们的哈希码必须相等,但反之则不一定;
②当一个对象被存储进哈希集合钟以后就不能修改这个对象中参与了哈希码计算的字段了,否则修改后的哈希值跟存储时的哈希值就不一样了,那么当以后需要检索这个对象时根据新的哈希码就检索不到此对象,而想要移除这个对象时也会无法删除这个对象,从而造成内存泄露;
下边是代码样例:
public class Employee { private String name ; private String boss; public Employee(String _name) { name = _name; } public Employee(String _name,String _boss) { name = _name; boss = _boss; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getBoss() { return boss; } public void setBoss(String boss) { this.boss = boss; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((boss == null) ? 0 : boss.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Employee other = (Employee) obj; if (boss == null) { if (other.boss != null) return false; } else if (!boss.equals(other.boss)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } }
测试代码:
import java.util.Collection; import java.util.HashSet; public class HashTest { @SuppressWarnings("unchecked") public static void main(String[] args) { Employee e1 = new Employee("张三", "李四"); Employee e2 = new Employee("李大嘴", "吕秀才"); Employee e3 = new Employee("张三", "李四"); Collection collection = new HashSet(); collection.add(e1); collection.add(e2); collection.add(e3); e2.setName("李小嘴"); //由于重算了hashcode,e2的内存地址已经不是原先的内存地址了,这里也就无法移除e2,这就会导致内存泄露 collection.remove(e2); System.out.println(collection.size());//输出还是2 } }
重写equals必须重写hashcode算法,如果仅重写equals,如果你new出两个对象,其实两个对象是相等的,但是Object的hashCode是=操作,即比较地址,很显然,两个对象的内存地址是不一样的,hash值肯定不同,但是两个对象却是是相同的,所以这是你必须重写Object的hashCode方法。
相关推荐
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
java中hashcode和equals的详解.pdf
本文档详细介绍了set接口为什么会用到hashCode和equals方法以及这两个方法的一些探讨 set不同的实现类用到的这两个方法也不同
在这篇文章中,我将告诉大家我对hashCode和equals方法的理解。我将讨论他们的默认实现,以及如何正确的重写他们。我也将使用Apache Commons提供的工具包做一个实现。 hashCode()和equals()定义在Object类中,这...
有许多人学了很长时间的Java,但一直不明白hashCode方法的作用,我来解释一下吧。首先,想要明白hashCode的作用,你必须要先知道Java中的集合。
HashCode相同equals不同的2位字符集合算法 另附ASCII码表
关于hashCode()和equals()的本质区别和联系.doc
主要介绍了重写hashCode()和equals()方法详细介绍,涉及重写equals()方法,重写hashCode()方法,重写equals()而不重写hashCode()的风险等相关内容的介绍,具有一定借鉴价值,需要的朋友可以参考下
NULL 博文链接:https://zpointer.iteye.com/blog/1058337
hashcode、equals、==总结1简单总结.txt,他们之间的区别
重写equals和hashcode方法,学习和进步
主要介绍了详解hashCode()和equals()的本质区别和联系,本文先对两种方法作了介绍,然后对二者联系进行分析,具有一定参考价值,需要的朋友可以了解下。
更清楚的了解hashcode()和equals()方法。
本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。
文章目录1、hashCode与equals两者之间的关系2、== 和equals的区别`3、为什么要重写equals()方法?4、重写equals()方法5、为什么要重写hashCode()方法?6、什么时候需要重写hashCode()方法?7、重写hashCode()方法: ...
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
hashcode()和equals() 博客地址:https://blog.csdn.net/qq_36963950/article/details/107543471
hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。下面这篇文章主要给大家介绍了关于java中hashCode、equals的使用方法,需要的朋友可以参考下。
这里是一个文档,里边讲解了hashCode与equals方法使用,大家要是不明白,可以去看看
hashcode和equals的区别