在往HashSet集合中放数据的时候,由于HashSet底层是用HashMap中的Key属性存储的,所以是不能重复的,那他如何判断其不是重复的元素呢.这个时候他判断有两步.
1.调用元素的hashcode
方法,判断两对象的hashCode
是否相等,如果不相等,则认为两对象不相等,结束.如果相等,则转入equals
方法进行判断.
2.如果equals
方法返回true则,是相等的.如果返回false则是不相等的.结束.这里是最终结果.
总的归纳是如果在调用hashCode
方法时判断了对象不相等那就有了结论.不用调用equals
方法了
如要以上推论成立,需要验证四个结论:
1.这个hashCode
方法中返回的结果是永远也不相等的,因此会调用equals
方法进行判断,结果是所有元素都打印出来了.
2.hashCode
方法不变,修改equals
方法,让其总返回false,结果和1一样.
---->以上两点成立的话,说明hashCode
方法返回的值不相等的话,结果就与equals
方法无关了.
3.当把hashCode
方法中返回数改成一常量时,equas方法总return
false,结果是返回第一个元素;
4.当把hashCode
方法中返回数改成一常量时,equas方法总return
ture 结果返回全部元素.
----->以上两点成立的话,说明hashCode
方法返回的值相等的话,结果有equals
方法控制.
import java.util.HashSet;
import java.util.Iterator;
public class TestHashSet {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet hs = new HashSet();
String a="123";
hs.add(new Element(a,"mengchao"));
hs.add(new Element(a,"mengchao"));
hs.add(new Element("1234","mengchao3"));
Iterator it=hs.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
class Element{
private String num;
private String name;
static int i=0;
public Element(String num,String name){
this.num=num;
this.name=name;
}
public String toString(){
return "学号为:"+num+";————名字为"+name;
}
public int hashCode(){
return i++;
}
public boolean equals(Object o){
Element os = (Element)o;
return true;
}
}
结果:
学号为:1234;————名字为mengchao3
学号为:123;————名字为mengchao
学号为:123;————名字为mengchao
将equals
方法中 return true;
改成 return false;结果还是一样.
import java.util.HashSet;
import java.util.Iterator;
public class TestHashSet {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet hs = new HashSet();
String a="123";
hs.add(new Element(a,"mengchao"));
hs.add(new Element(a,"mengchao"));
hs.add(new Element("1234","mengchao3"));
Iterator it=hs.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
class Element{
private String num;
private String name;
//static int i=0;
public Element(String num,String name){
this.num=num;
this.name=name;
}
public String toString(){
return "学号为:"+num+";————名字为"+name;
}
public int hashCode(){
return 3;
}
public boolean equals(Object o){
Element os = (Element)o;
return true;
}
}
运行结果:
学号为:123;————名字为mengchao
将equals
方法中 return true;
改成 return false;
运行结果:
学号为:1234;————名字为mengchao3
学号为:123;————名字为mengchao
学号为:123;————名字为mengchao
在Object类中定义的几个hashCode约定如下:
1. 在同一应用中,一个对象的hashCode函数在equals函数没有更改的情况下,无论调用多少次,它都必须返回同一个整数。
2. 两个对象如果调用equals函数是相等的话,那么调用hashCode函数一定会返回相同的整数。
3. 两个对象如果调用equals函数是不相等的话,那么调用hashCode函数不要求一定返回不同的整数。
补充一点我自己的看法,拿HashMap来举例,
在HashMap中保存元素的值是一个 transient Entry[] table,也就是一个数组。在这里要特别注意Entry的元素,在Entry中它有一个属性next,记录了和本节点具有相同的Hash码的对象。但是它们的Equals方法返回的是false。这也解释了为什么先去判断HashCode值,还要再去判断equals方法了。
在往HashMap中加入数据的过程是这样的,首先要根据key的hashcode值,根据一定的散列算法,找到对应table上的位置,如果该位置已经有value存在了,那么,判断旧value的key和新插入值的key的equals方法是否相等,如果相等,把旧value替换成新插入值。key不变(因为hashcode和equals都相等,HashMap就认为这两个key是相等的)。如果不相等,则将旧value的entry的next属性设置为新value对应的entry属性(实际上这就是解决hash冲突的一种方法)。
从HashMap中取出元素的过程和上面刚好相反,在这里就不叙述了。
分享到:
相关推荐
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
本文档详细介绍了set接口为什么会用到hashCode和equals方法以及这两个方法的一些探讨 set不同的实现类用到的这两个方法也不同
HashCode相同equals不同的2位字符集合算法 另附ASCII码表
在这篇文章中,我将告诉大家我对hashCode和equals方法的理解。我将讨论他们的默认实现,以及如何正确的重写他们。我也将使用Apache Commons提供的工具包做一个实现。 hashCode()和equals()定义在Object类中,这...
主要介绍了重写hashCode()和equals()方法详细介绍,涉及重写equals()方法,重写hashCode()方法,重写equals()而不重写hashCode()的风险等相关内容的介绍,具有一定借鉴价值,需要的朋友可以参考下
重写equals和hashcode方法,学习和进步
更清楚的了解hashcode()和equals()方法。
有许多人学了很长时间的Java,但一直不明白hashCode方法的作用,我来解释一下吧。首先,想要明白hashCode的作用,你必须要先知道Java中的集合。
这里是一个文档,里边讲解了hashCode与equals方法使用,大家要是不明白,可以去看看
本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。
java中hashcode和equals的详解.pdf
关于hashCode()和equals()的本质区别和联系.doc
文章目录1、hashCode与equals两者之间的关系2、== 和equals的区别`3、为什么要重写equals()方法?4、重写equals()方法5、为什么要重写hashCode()方法?6、什么时候需要重写hashCode()方法?7、重写hashCode()方法: ...
hashcode、equals、==总结1简单总结.txt,他们之间的区别
Java equals 方法与hashcode 方法的深入解析.rar
hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。下面这篇文章主要给大家介绍了关于java中hashCode、equals的使用方法,需要的朋友可以参考下。
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
hashcode()和equals() 博客地址:https://blog.csdn.net/qq_36963950/article/details/107543471
在Java中,equals和hashCode方法是Object中提供的两个方法,这两个方法对以后的学习有很大的帮助,本文就深度来去讲解这两个方法。下面小编带大家来一起学习吧
今天小编就为大家分享一篇关于关于Object中equals方法和hashCode方法判断的分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧