Set判断两对象是否相同,不是使用==运算符,而是根据equals方法,只要方法返回值为true,Set就不会接收这两个对象。
HashSet是Set接口的典型实现,大多数使用Set集合时就使用这个实现类。
其具有以下几个特点:
不能保证元素的排列顺序,顺序有可能发生变化。
HashSet不是同步的,假设多个线程同时修改HashSet集合时,则必须通过代码来实现。
集合元素可以为null。
当向HashSet集合存入一个集合时,HashSet会调用该对像的hashCode方法来得到该对像的hashCode值,根据该值来确定该对像在HashSet中储存的位置,HashSet判断两个对象相等必须通过equals方法相等,并且两个对象返回的hashCode的值相等。
import java.util.HashSet;
class A{
public boolean equals(Object obj){
return true;
}
}
class B{
public int hashCode(){
return 8;
}
}
class C{
public boolean equals(Object obj){
return true;
}
public int hashCode(){
return 2;
}
}
public class JiHeDemo{
public static void main(String[] args) {
HashSet h=new HashSet();
h.add(new A());
h.add(new A());
h.add(new B());
h.add(new B());
h.add(new C());
h.add(new C());
System.out.println(h);
}
}
如果两对象的hashCode方法返回的hashCode值相同,但是通过equals方法比较返回的是false将会比较麻烦,因为两对象HashCode值相同,所以HashSet试图将他们保存在同一位置,但是又不行(否则将只剩下一个对象),而hashSet访问集合元素时,也是根据元素的hashCode值来快速定位的。如果HashSet两个以上的元素具有相同的hashCode值,将会导致性能的下降。
网友评论