今天在使用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() 方法要求:內存
hashCode() 方法雖然是內存編號,可是跟內存是沒有關係的get
爲啥有了equal() 方法還要有hashCode() 方法呢?hash
hash 散列算法使得在hash表中查找一個記錄的速度爲O(1),每一個記錄都有本身的hashCode,散列算法按照hashcode 把記錄放在合適的位置上;it
當查找一個記錄時,首先經過hashcode 快速定位記錄的位置,而後經過equals 方法比較是否相等。
若是沒有hashCode方法,那麼就是一個個的比較,時間就會是O(N),性能就很差了。