如果有的同學對equals()和hashCode()的用法和作用不熟悉(是熟悉),請先看一下這個
hashCode() 和equals() 區別和作用
------------------------------------------------------
package com.lee.collectionPac;
import java.util.HashSet;
class A {
public boolean equals(Object obj) {
return true;
}
}
class B {
public int hashCode() {
return 1;
}
}
class C {
@Override
public int hashCode() {
// TODO Auto-generated method stub
return 2;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return true;
}
}
public class HashSetTest {
public static void main(String[] args) {
HashSet hs = new HashSet();
// HashSet判斷兩個元素相等的標準是兩個對象通過equals()方法比較相等和通過hashCode()方法的返回值相等
hs.add(new A());
hs.add(new A());
hs.add(new B());
hs.add(new B());
hs.add(new C());
System.out.println(hs);
System.out.println("hs的大小是:" + hs.size());
}
}
-------------------------------------------------------
下面的程序,如果你能看的明白,說明你明白了這個問題.
package com.lee.collectionPac;
import java.util.HashSet;
import java.util.Iterator;
class R {
int count;
public R(int count) {
this.count = count;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return count;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if (this == obj)
return true;
if (obj != null && obj.getClass() == this.getClass()) {
R r = (R) obj;
return r.count == this.count;
}
return false;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "count:" + count + "\n";
}
}
public class HashSetTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet<R> hs = new HashSet<>();
hs.add(new R(5));
hs.add(new R(-3));
hs.add(new R(9));
hs.add(new R(-2));
System.out.println(hs);
//
Iterator<R> it = hs.iterator();
R first = it.next();
first.count = 5;
// 有重複元素,equals相等,hashCode返回值不相等
System.out.println(hs);
//
hs.remove(new R(5));
System.out.println(hs);
System.out.println("是否存在count爲-2的元素:"+hs.contains(new R(-2)));
//修改的哪一個看似count爲5的元素,實際上地址和new R(5)並不一樣,於是他們的hashcode不一樣
System.out.println("是否存在count爲5的元素:"+hs.contains(new R(5)));
}
}
-----------------------------------------------------------
<span style="color:#ff0000;">特別叮囑一下:沒事別瞎改和equals(),hashCode()有關係的變量值,一旦你改了,很有可能導致HashSet的實例沒法操作元素.</span>