HashSet如何判斷加入的元素是否相同?

如果有的同學對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>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章