BitSet的使用場景及簡單示例
BitSet簡介
類實現了一個按需增長的位向量。位 set 的每個組件都有一個boolean值。用非負的整數將BitSet的位編入索引。可以對每個編入索引的位進行測試、設置或者清除。通過邏輯與、邏輯或和邏輯異或操作,可以使用一個BitSet修改另一個BitSet的內容。
默認情況下,set 中所有位的初始值都是false。
每個位 set 都有一個當前大小,也就是該位 set 當前所用空間的位數。注意,這個大小與位 set 的實現有關,所以它可能隨實現的不同而更改。位 set 的長度與位 set 的邏輯長度有關,并且是與實現無關而定義的。
除非另行說明,否則將 null 參數傳遞給BitSet中的任何方法都將導致NullPointerException。
在沒有外部同步的情況下,多個線程操作一個BitSet是不安全的
基本原理
用1位來表示一個數據是否出現過,0為沒有出現過,1表示出現過。使用用的時候既可根據某一個是否為0表示,此數是否出現過。
一個1G的空間,有 8*1024*1024*1024=8.58*10^9bit,也就是可以表示85億個不同的數
使用場景
常見的應用是那些需要對海量數據進行一些統計工作的時候,比如日志分析、用戶數統計等等
如統計40億個數據中沒有出現的數據,將40億個不同數據進行排序等。
現在有1千萬個隨機數,隨機數的范圍在1到1億之間。現在要求寫出一種算法,將1到1億之間沒有在隨機數中的數求出來
代碼示例
package util;import java.util.BitSet;
public class BitSetDemo { private BitSet used = new BitSet();
/** * 求一個字符串包含的char * */ public void contrainChars(String str) { for (int i = 0; i < str.length(); i++) used.set(str.charAt(i)); // set bit for char StringBuilder sb = new StringBuilder(); sb.append("["); int size = used.size(); System.out.println(size); for (int i = 0; i < size; i++) { if (used.get(i)) { sb.append((char) i); } } sb.append("]"); System.out.println(sb.toString()); } /** * 求素數 * 有無限個。一個大于1的自然數,如果除了1和它本身外,不能被其他自然數整除(除0以外)的數稱之為素數(質數) 否則稱為合數 */ public void computePrime() { BitSet sieve = new BitSet(1024); int size = sieve.size(); for (int i = 2; i < size; i++) sieve.set(i); int finalBit = (int) Math.sqrt(sieve.size()); for (int i = 2; i < finalBit; i++) if (sieve.get(i)) for (int j = 2 * i; j < size; j += i) sieve.clear(j); int counter = 0; for (int i = 1; i < size; i++) { if (sieve.get(i)) { System.out.printf("%5d", i); if (++counter % 15 == 0) System.out.println(); } } System.out.println(); } /** * 簡單使用示例 */ public void simpleExample() { String names[] = { "Java", "Source", "and", "Support" }; BitSet bits = new BitSet(); for (int i = 0, n = names.length; i < n; i++) { if ((names[i].length() % 2) == 0) { bits.set(i); } } System.out.println(bits); System.out.println("Size : " + bits.size()); System.out.println("Length: " + bits.length()); for (int i = 0, n = names.length; i < n; i++) { if (!bits.get(i)) { System.out.println(names[i] + " is odd"); } } BitSet bites = new BitSet(); bites.set(0); bites.set(1); bites.set(2); bites.set(3); bites.andNot(bits); System.out.println(bites); } public static void main(String args[]) { BitSetDemo bs = new BitSetDemo(); bs.contrainChars("How do you do? 你好呀"); bs.computePrime(); bs.simpleExample(); }}</pre>
參考:
http://blog.csdn.net/haojun186/article/details/8482343
來自:http://my.oschina.net/cloudcoder/blog/294810