天天看點

java bitset怎麼了解_淺談Java BitSet使用場景和代碼示例

一、什麼是BitSet?

注:以下内容來自JDK API:

BitSet類實作了一個按需增長的位向量。位Set的每一個元件都有一個boolean值。用非負的整數将BitSet的位編入索引。可以對每個編入索引的位進行測試、設定或者清除。通過邏輯與、邏輯或和邏輯異或操作,可以使用一個 BitSet修改另一個 BitSet的内容。

預設情況下,set 中所有位的初始值都是false。

每個位 set 都有一個目前大小,也就是該位 set 目前所用空間的位數。注意,這個大小與位 set 的實作有關,是以它可能随實作的不同而更改。位 set 的長度與位 set 的邏輯長度有關,并且是與實作無關而定義的。

一個Bitset類建立一種特殊類型的數組來儲存位值。BitSet中數組大小會随需要增加。這和位向量(vectorofbits)比較類似。

這是一個傳統的類,但它在Java2中被完全重新設計。

BitSet定義了兩個構造方法。

第一個構造方法建立一個預設的對象:

BitSet()

第二個方法允許使用者指定初始大小。所有位初始化為0。

BitSet(intsize)

二、Java BitSet實作原理

在java中,BitSet的實作位于java.util包中:

public class BitSet implements Cloneable, java.io.Serializable

{

private final static int ADDRESS_BITS_PER_WORD = 6;

private final static int BITS_PER_WORD = 1 << ADDRESS_BITS_PER_WORD;

private final static int BIT_INDEX_MASK = BITS_PER_WORD - 1;

private static final long WORD_MASK = 0xffffffffffffffffL;

private static final ObjectStreamField[] serialPersistentFields =

{

new ObjectStreamField("bits", long[].class),

}

;

private long[] words;

.....

}

可以看到,BitSet的底層實作是使用long數組作為内部存儲結構的,是以BitSet的大小為long類型大小(64位)的整數倍。

它有兩個構造函數:

1、BitSet():建立一個新的位 set,預設大小是64位。

public BitSet()

{

initWords(BITS_PER_WORD);

sizeIsSticky = false;

}

2、BitSet(int nbits):建立一個位set,它的初始大小足以顯式表示索引範圍在 0 到 nbits-1 的位。

public BitSet(int nbits)

{

// nbits can't be negative; size 0 is OK

if (nbits < 0)

throw new NegativeArraySizeException("nbits < 0: " + nbits);

initWords(nbits);

sizeIsSticky = true;

}

注:

1、如果指定了bitset的初始化大小,那麼會把他規整到一個大于或者等于這個數字的64的整倍數。比如64位,bitset的大小是1個long,而65位時,bitset大小是2個long,即128位。做這麼一個規定,主要是為了記憶體對齊,同時避免考慮到不要處理特殊情況,簡化程式。

2:BitSet的size方法:傳回此 BitSet 表示位值時實際使用空間的位數,值是64的整數倍

length方法:傳回此 BitSet 的“邏輯大小”:BitSet 中最高設定位的索引加 1

三、使用場景

常見的應用場景是對海量資料進行一些統計工作,比如日志分析、使用者數統計等。

之前在阿裡的實習面試就被問到一道題:有1千萬個随機數,随機數的範圍在1到1億之間。現在要求寫出一種算法,将1到1億之間沒有在随機數中的數求出來?

代碼示例如下:

public class Alibaba

{

public static void main(String[] args)

{

Random random=new Random();

List list=new ArrayList<>();

for (int i=0;i<10000000;i++)

{

int randomResult=random.nextint(100000000);

list.add(randomResult);

}

System.out.println("産生的随機數有");

for (int i=0;i

{

System.out.println(list.get(i));

}

BitSet bitSet=new BitSet(100000000);

for (int i=0;i<10000000;i++)

{

bitSet.set(list.get(i));

}

System.out.println("0~1億不在上述随機數中有"+bitSet.size());

for (int i = 0; i < 100000000; i++)

{

if(!bitSet.get(i))

{

System.out.println(i);

}

}

}

}

總結

以上就是本文關于淺談Java BitSet使用場景和代碼示例的全部内容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支援!