一個Apache CollectionUtils.intersection 方法的簡單問題

今天在使用CollectionUtils.intersection()  的時候,發現個問題,明明兩個集合中有幾個徹底相同的類,可是使用這個intersection 方法的時候求到的交集倒是空的?java

其實很簡單,這個問題每每是由於沒有重寫對象的equal 方法致使的。算法

其實在使用不少工具集,在比較對象的時候,重寫equal() 方法和重寫hashcode 方法是頗有必要的。工具

來看一看intersection 方法:性能

public static Collection intersection(Collection a, Collection b) {
		ArrayList list = new ArrayList();
		Map mapa = getCardinalityMap(a);  //key爲a的元素,value爲元素出現次數
		Map mapb = getCardinalityMap(b);
		HashSet elts = new HashSet(a);
		elts.addAll(b);   //元素經hash去重後的並集 
		Iterator it = elts.iterator();

		while (it.hasNext()) {
			Object obj = it.next();    
			int i = 0;        
 
 			//對於每一個元素,若是a或b沒有此元素,那麼跳過;若是都有若干個,那麼放入「個數較小一方」個該元素
            //能夠看到,無論作交集以前有多少個相同對象,只要他們hash一致,放入結果集的都是同一個對象
			for (int m = Math.min(getFreq(obj, mapa), getFreq(obj, mapb)); i < m; ++i) {
				list.add(obj);
			}
		}

		return list;
	}

再補充幾句:code

關於hashcode,能夠理解爲 標識當前對象狀態的數字標識, Object 默認的hashcode 會返回一個內存編號;對象

hashcode() 方法要求:內存

  • 當對象狀態未改變時,那麼屢次調用返回的值必須相等;
  • 兩個對象equal,那麼對象調用返回的值必須相等

hashCode() 方法雖然是內存編號,可是跟內存是沒有關係的get

 

爲啥有了equal() 方法還要有hashCode() 方法呢?hash

hash 散列算法使得在hash表中查找一個記錄的速度爲O(1),每一個記錄都有本身的hashCode,散列算法按照hashcode 把記錄放在合適的位置上;it

當查找一個記錄時,首先經過hashcode 快速定位記錄的位置,而後經過equals 方法比較是否相等。

若是沒有hashCode方法,那麼就是一個個的比較,時間就會是O(N),性能就很差了。

相關文章
相關標籤/搜索