JAvaビッグデータ量差分セット、list.removeAll性能最適化

1289 ワード

今日、プロジェクトの勤務同期機能を最適化する際に、勤務機のデータをデータベースに同期することに遭遇しました.
両方とも数万本のデータの様子で、古いコードのやり方の差は大半の時間ではありません.最適化後、私は40秒も差がありません.サーバーの速度はもっと理想的です.
2つのデータセットの差分セットを取るためにまず考えられる方法はList.removeAll法であるが,jdkが持参するList.removeAllの効率が低いことが実験で分かった
List.removeAll効率が低い理由:
List.removeAllの効率が低いことはリスト集合自体の特徴と関係がある :
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();			
			}	
		}