HashSet集合---HashCode方法与equals方法
概述
当我们向有序集合(例如ArrayList)里面添加元素的时候,我们不用对元素有什么特别要求,集合可以通过下标对不同元素进行区分,但是,当我们向无序集合里面添加元素(例如HashSet),由于集合是无序的,系统不能通过下标对不同的元素进行区分,此时,需要通过某些方法对集合的不同元素进行区分——HashCode()与equals()。
关于HashSet
这个集合属于无序集合,集合里面不能存入相同元素(即使是两个内容相同的不同对象也不可以),每当你向集合里面添加元素,系统都要判断一下该元素与集合里的元素是否重复,如果你向集合里面添加的元素是java原本有的对象,他们一般都自带了判定方法,如果你向集合里面添加的是自定义的对象,那么,你需要提供方法让系统可以判定元素是否重复。此时,你要做的事情就是:在你的自定义对象里面(就是你自己写的类),复写题目所写两个方法。
方法原型以及比较原则
1,HashCode方法原型:public int hashCode()//该方法返回一个整数值,就是所谓的哈希码值,当你添加一个自定义的对象进入集合,集合就会调用这个方法(调用你复写的这个方法),获取当前对象所对应的哈希码值。
2,equals方法原型:public boolean equals(Object object)()//相同返回true,否则返回false。
3,比较原则:
(1)当自定义对象存入集合,将先调用HashCode方法,如果得到哈希码值与集合内任一元素哈希码值没有重复,认为元素不是相等,直接存入,此时忽略equals方法。
(2)如果得到哈希码值有所重复,调用equals方法,如果得到true,认为重复,不得存入,否则认为可以存入。由此我们可以看出,HashCode方法相等,不能完全说明对象相等,当HashCode方法返回了相同值,将会调用equals()方法作进一步确认。
4,基于上述比较原则,当你复写这两方法那时,应该做到:
(1)同一对象每次调用hashCode()必须得到同一样的哈希码值,不然你复写该方法没意义了。
(2)不同对象调用hashCode()方法说得到的哈希码值,可以相同,也可以不同,这个没有硬性规定。
为什么要做到以上两点?这是为了能够适应比较原则:由于同一对象每次调用HashCode()方法,所得到的哈希码值是一样的,所以如果所得到的哈希码值不同,说明不是一个对象,这满足了第一个的比较原则,不同对象调用HashCode()方法所得到的哈希码值,可以相同,可以不同,所以当得到的哈希码值相同,还要调用equals()方法,这满足了第二个的比较原则。
四,我们应该如何重写那两方法:这个根据你自定义的那个类而定,这里提供一个例子。
class Person//这是一个自定义类
{
private String name;
private int age;
Person(String name,int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
public boolean equals(Object obj)
{
if( !(obj instanceof Person) )
return false;
Person p = (Person)obj;
return this.name.equals(p.getName())&&this.age==p.getAge();
}
public int hashCode()
{
return this.name.hashCode()+this.age;//姓名和年龄均相同的人才会得到同一样的哈希码值
}
}