今天在优化项目中的考勤同步功能时遇到将考勤机中的数据同步到数据库,
两边都是几万条数据的样子,老代码的做法差不多半个小时,优化后我本机差不多40秒,服务器速度会更加理想。
两个数据集取差集首先想到的方法便是List.removeAll方法,但是实验发现jdk自带的List.removeAll效率很低
List.removeAll效率低原因:
List.removeAll效率低和list集合本身的特点有关 :
List底层数据结构是数组,查询快,增删慢
1.List.contains()效率没有hashset高
arrayList.removeAll底层是for循化调用contains方法。arrayList虽然用get(index)方法查询效率高,但是若用contains方法查询对象元素,Set集合应该比List效率要高。
因为hashset的contains方法其实是先调用每个元素的hashCode()方法来返回哈希码,如果哈希码的值相等的情况下再调用equals(obj)方法去判断是否相等,只有在这两个方法所返回的值都相等的情况下,才判定这个HashSet包含某个元素,而list直接调用equals(obj)方法.所以hashset效率更高。
2.arrayList.remove()效率没有linkedList删除效率高
arrayList底层采用数组每删除一下元素数据后面的元素都要往前移动效率低消耗的资源也大,linkedList链表删除元素只要改变前后节点的位置信息
3.采用Iterator迭代器,这种方式我们仅需要对iterator进行循环,然后对需要删除的元素执行iterator.remove(iterator.next()),而无需关注下标的问题
改进代码
LinkedList linkedList= new LinkedList(src);//大集合用linkedlist
HashSet hashSet= new HashSet(oth);//小集合用hashset
Iterator iter = linkedList.iterator();//采用Iterator迭代器进行数据的操作
while(iter.hasNext()){
if(hashSet.contains(iter.next())){
iter.remove();
}
}
补充知识:JAVA获取两个数据量较大的ArrayList的交集、差集以及并集
测试说明:获取firstArrayList和secondArrayList的交集、差集以及并集。实际测试中firstArrayList数据量19000