Java程式設計中的HashSet和BitSet

chszs發表於2012-10-25
版權宣告:本文為博主chszs的原創文章,未經博主允許不得轉載。 https://blog.csdn.net/chszs/article/details/8112839

作者:chszs,轉載需註明。
作者部落格主頁:http://blog.csdn.net/chszs

我在Apache的開發郵件列表中發現一件很有趣的事,Apache Commons包的ArrayUtils類的removeElements方法,原先使用的HashSet現在換成了BitSet。

HashSet<Integer> toRemove = new HashSet<Integer>();
for (Map.Entry<Character, MutableInt> e : occurrences.entrySet()) {
    Character v = e.getKey();
    int found = 0;
    for (int i = 0, ct = e.getValue().intValue(); i < ct; i++) {
        found = indexOf(array, v.charValue(), found);
        if (found < 0) {
            break;
        }
        toRemove.add(found++);
    }
}


return (char[]) removeAll((Object)array, extractIndices(toRemove));

作者:chszs,轉載需註明。作者部落格主頁:http://blog.csdn.net/chszs

新程式碼如下:

BitSet toRemove = new BitSet();
for (Map.Entry<Character, MutableInt> e : occurrences.entrySet()) {
    Character v = e.getKey();
    int found = 0;
    for (int i = 0, ct = e.getValue().intValue(); i < ct; i++) {
        found = indexOf(array, v.charValue(), found);
        if (found < 0) {
            break;
        }
        toRemove.set(found++);
    }
}
return (char[]) removeAll(array, toRemove);

為什麼會使用BitSet代替HashSet呢?

據Apache Commons作者指出,這樣程式碼執行時可以佔用更少的記憶體,速度也更快。


相關文章