今天在网上看到一篇转载率很高,介绍HashCode和equals两个方法的文章,觉得说错了.现在把我的想法写出来,供大家一同参考
在往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方法控制.
第一个:
package p4;
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;结果还是一样.
第二个论证:
package p4;
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
论证结束.