一个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),性能就很差了。

相关文章
相关标签/搜索