HashSet按Hash算法来存储集合的元素,因此具有很好的存取和查找性能。
HashSet的特点:
(1)HashSet不是同步的,多个线程访问是需要通过代码保证同步
(2)集合元素值可以使null。
HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值也相等。
- //类A的equals方法总是返回true,但没有重写其hashCode()方法
- class A
- {
- public boolean equals(Object obj)
- {
- return true;
- }
- }
- //类B的hashCode()方法总是返回1,但没有重写其equals()方法
- class B
- {
- public int hashCode()
- {
- return 1;
- }
- }
- //类C的hashCode()方法总是返回2,但没有重写其equals()方法
- class C
- {
- public int hashCode()
- {
- return 2;
- }
- public boolean equals(Object obj)
- {
- return true;
- }
- }
- public class TestHashSet
- {
- public static void main(String[] args)
- {
- HashSet<Object> books = new HashSet<Object>();
- //分别向books集合中添加2个A对象,2个B对象,2个C对象
- books.add(new A());
- books.add(new A());
- books.add(new B());
- books.add(new B());
- books.add(new C());
- books.add(new C());
- System.out.println(books);
- }
- }
程序运行结果:
- [B@1, B@1, C@2, A@b5dac4, A@9945ce]
即使2个A对象通过equals比较返回true,但HashSet依然把它们当成2个对象;即使2个B对象的hashCode()返回相同值,但HashSet依然把它们当成2个对象。即如果把一个对象放入HashSet中时,如果重写该对象equals()方法,也应该重写其hashCode()方法。其规则是:如果2个对象通过equals方法比较返回true时,这两个对象的hashCode也应该相同。
|