- import java.util.HashSet;
- import java.util.Iterator;
- class A {
- int count;
- public A() {
- };
- public A(int count) {
- this.count = count;
- }
- public String toString() {
- return this.count + "";
- }
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj != null && obj.getClass() == A.class) {
- A a = (A) obj;
- if (this.count == a.count) {
- return true;
- }
- }
- return false;
- }
- public int hashCode() {
- return (int) this.count;
- }
- }
- public class TestHashSet {
- public static void main(String[] args) {
- A Second = new A();
- HashSet hs = new HashSet();
- hs.add(new A(1));
- hs.add(new A(2));
- hs.add(new A(3));
- System.out.println("输出的集合元素为->" + hs); // ①这里输出 1,2,3
- Iterator it = hs.iterator(); // 迭代集合元素
- A first = (A) it.next(); // 迭代第一个元素
- first.count = 2;
- A second = (A) it.next();
- System.out.println("输出的集合元素为->" + hs); // ②这里输出2,2,3
-
-
- System.out.println("first和second是一个对象吗?"+ (first == second)); //③返回false,表示不是一个对象
- System.out.println("first和second是相等吗?"+first.equals(second)); //③返回true,表示是相等的,相等并不是说一个对象
- System.out.print("first和second的hashCode相等吗?----->" + (first.hashCode() == second.hashCode())); //④返回true,表示在hashcod相等,注意此时hashcode是存储以后改变了存的元素的hashcode后的结果
-
- }
- }
复制代码 关于hashcode的问题,由于你是令hashcode等于自身的count,所以哪几个对象hashcode相等与否是很明白;
其次这里你要知道,next返回的应该是对象的引用,而不是对象的副本.
开始时你存了三个对象,他们的count都不同,即hashcode也不行,所以都存进去了没有问题;
然后,你调用next返回的first是第一个对象的引用,你又用first.count = 2改变了第一个对象的count也即改变了其hashcode,此时,第一个对象与第二个对象hascode就相同了,都等于他们的count,此时虽然hashcode重复,但已经存储了,不会自动删除hashcode重复的对象
|