removeAll()メソッドは、長い時間がかかっています

Gangs165700:
List<Batch> vAllBatchList = getAllBatchCollection().toList(); //Has 700k records
List<Batch> vKeepableBatchCollection = getKeepableBatchCollection(pDaysKeepHistory).toList(); //has 600k records
vAllBatchList.removeAll(vKeepableBatchCollection);

上記の3行目のがremoveAll方法で仕上げにあまりにも多くの時間を取っています。ここのremoveAll方法を最適化するには?

彼らは次のとおりでした:

あなたが変換した場合Listに削除するには、要素のをSet、それはより速くする必要があります:

vAllBatchList.removeAll(new HashSet<>(vKeepableBatchCollection));

これは仮定されたBatchクラスのオーバーライドをhashCodeし、equals適切に。

説明:removeAllのためにArrayList(私はあなたが想定していvAllBatchList ListているArrayListのすべての要素を反復)List渡され、それが呼び出された上で、そしてかどうかをチェックしCollection、それらが含まれています。合格した場合CollectionSetcontains期待される一定の時間を(かかるO(1)場合ながら、)CollectionList、それは線形時間がかかります(O(n))。

もちろん、あなたが直接生成することができるかどうかSetの要素のvKeepableBatchCollection代わりに、最初の作成のList、その後に変換しSet、それも良いだろう。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=292926&siteId=1