今天在使用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),性能就很差了。