java bitset用途_浅谈Java BitSet使用场景和代码示例
搜索熱詞
@H_502_0@一、什么是BitSet?
@H_502_0@ 注:以下內容來自JDK API:
@H_502_0@ BitSet類實現了一個按需增長的位向量。位Set的每一個組件都有一個boolean值。用非負的整數將BitSet的位編入索引。可以對每個編入索引的位進行測試、設置或者清除。通過邏輯與、邏輯或和邏輯異或操作,可以使用一個 BitSet修改另一個 BitSet的內容。
@H_502_0@ 默認情況下,set 中所有位的初始值都是false。
@H_502_0@ 每個位 set 都有一個當前大小,也就是該位 set 當前所用空間的位數。注意,這個大小與位 set 的實現有關,所以它可能隨實現的不同而更改。位 set 的長度與位 set 的邏輯長度有關,并且是與實現無關而定義的。
@H_502_0@一個Bitset類創建一種特殊類型的數組來保存位值。BitSet中數組大小會隨需要增加。這和位向量(vectorofbits)比較類似。
@H_502_0@這是一個傳統的類,但它在Java2中被完全重新設計。
@H_502_0@BitSet定義了兩個構造方法。
@H_502_0@第一個構造方法創建一個默認的對象:
@H_502_0@BitSet()
@H_502_0@第二個方法允許用戶指定初始大小。所有位初始化為0。
@H_502_0@BitSet(intsize)
@H_502_0@二、Java BitSet實現原理
@H_502_0@ 在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;
/* 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;
.....
}
@H_502_0@可以看到,BitSet的底層實現是使用long數組作為內部存儲結構的,所以BitSet的大小為long類型大小(64位)的整數倍。
@H_502_0@ 它有兩個構造函數:
@H_502_0@ 1、BitSet():創建一個新的位 set,默認大小是64位。
public BitSet()
{
initWords(BITS_PER_WORD);
sizeIsSticky = false;
}
@H_502_0@ 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;
}
@H_502_0@ 注:
@H_502_0@ 1、如果指定了bitset的初始化大小,那么會把他規整到一個大于或者等于這個數字的64的整倍數。比如64位,bitset的大小是1個long,而65位時,bitset大小是2個long,即128位。做這么一個規定,主要是為了內存對齊,同時避免考慮到不要處理特殊情況,簡化程序。
@H_502_0@ 2:BitSet的size方法:返回此 BitSet 表示位值時實際使用空間的位數,值是64的整數倍
@H_502_0@ length方法:返回此 BitSet 的“邏輯大小”:BitSet 中最高設置位的索引加 1
@H_502_0@三、使用場景
@H_502_0@ 常見的應用場景是對海量數據進行一些統計工作,比如日志分析、用戶數統計等。
@H_502_0@ 之前在阿里的實習面試就被問到一道題:有1千萬個隨機數,隨機數的范圍在1到1億之間。現在要求寫出一種算法,將1到1億之間沒有在隨機數中的數求出來?
@H_502_0@ 代碼示例如下:
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);
}
}
}
}
@H_502_0@總結
@H_502_0@以上就是本文關于淺談Java BitSet使用場景和代碼示例的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關文章
總結
如果覺得編程之家網站內容還不錯,歡迎將編程之家網站推薦給程序員好友。
本圖文內容來源于網友網絡收集整理提供,作為學習參考使用,版權屬于原作者。
如您喜歡尋找一群志同道合、互幫互助的學習伙伴,可以點擊下方鏈接加入:
編程之家官方1群:1065694478(已滿)
編程之家官方2群:163560250(已滿)
編程之家官方3群:312128206
總結
以上是生活随笔為你收集整理的java bitset用途_浅谈Java BitSet使用场景和代码示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arcgis飞行轨迹动画_高德地图,百度
- 下一篇: java中有hash集合_Java(1.