歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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();
 }
}

Copyright © Linux教程網 All Rights Reserved