setA.retainAll(setB);
long end = System.currentTimeMillis();
System.out.println(“[LinkedList-HashSet]RetainAll耗时:” + (end - begin));
}
3.『外层遍历+内层bitMap』查找:
BitSet也称作BitMap,它是一种通用的快速数据结构,不幸的是它太费内存,所以通常我们使用压缩位图。RoaringBitmap是一种压缩位置,它提供更好的压缩效果,在某些情况下比其它压缩位图快好几百倍。
https://github.com/RoaringBitmap/RoaringBitmap
RoaringBitmap已经使用在很多知名的开源项目中:
-
Apache Spark
-
Apache Hive
-
Apache Tez
-
Apache Kylin
-
… …
Roaringbitmap中在Long类型中,提供了2种实现 **Roaring64NavigableMap**
和 **Roaring64Bitmap**
。 Roaring64NavigableMap
基于红黑树实现, Roaring64Bitmap
基于ART( The Adaptive Radix Tree: ARTful Indexing for Main-Memory Databases )数据结构实现。
那么,外层使用ArrayList、LinkedList,内层使用Roaring64NavigableMap、Roaring64Bitmap。
// 外层:ArrayList,内层:Roaring64NavigableMap
private void outArrayListInnerRoaring64NavigableMap(List listA, List listB) {
long begin = System.currentTimeMillis();
ArrayList setA = new ArrayList<>(listA);
Roaring64NavigableMap ansB = new Roaring64NavigableMap();
listB.forEach(ansB::addLong);
setA.removeIf(e -> !ansB.contains(e));
long end = System.currentTimeMillis();
System.out.println(“[ArrayList-Roaring64NavigableMap]RetainAll耗时:” + (end - begin));
}
// 外层:LinkedList,内层:Roaring64NavigableMap
private void outLinkedListInnerRoaring64NavigableMap(List listA, List listB) {
long begin = System.currentTimeMillis();
LinkedList setA = new LinkedList<>(listA);
Roaring64NavigableMap ansB = new Roaring64NavigableMap();
listB.forEach(ansB::addLong);
setA.removeIf(e -> !ansB.contains(e));
long end = System.currentTimeMillis();
System.out.println(“[LinkedList-Roaring64NavigableMap]RetainAll耗时:” + (end - begin));
}
// 外层:ArrayList,内层:Roaring64Bitmap
private void outArrayListInnerRoaring64Bitmap(List listA, List listB) {
long begin = System.currentTimeMillis();
ArrayList setA = new ArrayList<>(listA);
Roaring64NavigableMap ansB &