您好,登錄后才能下訂單哦!
本篇文章為大家展示了BitSet怎么在Java中使用,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
一、什么是BitSet?
BitSet類實現(xiàn)了一個按需增長的位向量。位Set的每一個組件都有一個boolean值。用非負的整數(shù)將BitSet的位編入索引??梢詫γ總€編入索引的位進行測試、設置或者清除。通過邏輯與、邏輯或和邏輯異或操作,可以使用一個 BitSet修改另一個 BitSet的內(nèi)容。
默認情況下,set 中所有位的初始值都是false。
每個位 set 都有一個當前大小,也就是該位 set 當前所用空間的位數(shù)。注意,這個大小與位 set 的實現(xiàn)有關,所以它可能隨實現(xiàn)的不同而更改。位 set 的長度與位 set 的邏輯長度有關,并且是與實現(xiàn)無關而定義的。
一個Bitset類創(chuàng)建一種特殊類型的數(shù)組來保存位值。BitSet中數(shù)組大小會隨需要增加。這和位向量(vectorofbits)比較類似。
這是一個傳統(tǒng)的類,但它在Java2中被完全重新設計。
BitSet定義了兩個構造方法。
第一個構造方法創(chuàng)建一個默認的對象:
BitSet()
第二個方法允許用戶指定初始大小。所有位初始化為0。
BitSet(intsize)
二、Java BitSet實現(xiàn)原理
在java中,BitSet的實現(xiàn)位于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; /* Used to shift left or right for a partial word mask */ private static final long WORD_MASK = 0xffffffffffffffffL; private static final ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("bits", long[].class), } ; /** * The internal field corresponding to the serialField "bits". */ private long[] words; ..... }
可以看到,BitSet的底層實現(xiàn)是使用long數(shù)組作為內(nèi)部存儲結(jié)構的,所以BitSet的大小為long類型大小(64位)的整數(shù)倍。
它有兩個構造函數(shù):
1、BitSet():創(chuàng)建一個新的位 set,默認大小是64位。
public BitSet() { initWords(BITS_PER_WORD); sizeIsSticky = false; }
2、BitSet(int nbits):創(chuàng)建一個位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的初始化大小,那么會把他規(guī)整到一個大于或者等于這個數(shù)字的64的整倍數(shù)。比如64位,bitset的大小是1個long,而65位時,bitset大小是2個long,即128位。做這么一個規(guī)定,主要是為了內(nèi)存對齊,同時避免考慮到不要處理特殊情況,簡化程序。
2:BitSet的size方法:返回此 BitSet 表示位值時實際使用空間的位數(shù),值是64的整數(shù)倍
length方法:返回此 BitSet 的“邏輯大小”:BitSet 中最高設置位的索引加 1
三、使用場景
常見的應用場景是對海量數(shù)據(jù)進行一些統(tǒng)計工作,比如日志分析、用戶數(shù)統(tǒng)計等。
之前在阿里的實習面試就被問到一道題:有1千萬個隨機數(shù),隨機數(shù)的范圍在1到1億之間?,F(xiàn)在要求寫出一種算法,將1到1億之間沒有在隨機數(shù)中的數(shù)求出來?
代碼示例如下:
public class Alibaba { public static void main(String[] args) { Random random=new Random(); List<Integer> list=new ArrayList<>(); for (int i=0;i<10000000;i++) { int randomResult=random.nextint(100000000); list.add(randomResult); } System.out.println("產(chǎn)生的隨機數(shù)有"); for (int i=0;i<list.size();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億不在上述隨機數(shù)中有"+bitSet.size()); for (int i = 0; i < 100000000; i++) { if(!bitSet.get(i)) { System.out.println(i); } } } }
上述內(nèi)容就是BitSet怎么在Java中使用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。