BitSet的使用場景及簡單示例

jopen 11年前發布 | 21K 次閱讀 BitSet Java開發

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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!