BitSet怎么在Java中使用

本篇文章為大家展示了BitSet怎么在Java中使用,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、網(wǎng)頁(yè)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、新化網(wǎng)站維護(hù)、網(wǎng)站推廣。

一、什么是BitSet?

BitSet類實(shí)現(xiàn)了一個(gè)按需增長(zhǎng)的位向量。位Set的每一個(gè)組件都有一個(gè)boolean值。用非負(fù)的整數(shù)將BitSet的位編入索引??梢詫?duì)每個(gè)編入索引的位進(jìn)行測(cè)試、設(shè)置或者清除。通過(guò)邏輯與、邏輯或和邏輯異或操作,可以使用一個(gè) BitSet修改另一個(gè) BitSet的內(nèi)容。

默認(rèn)情況下,set 中所有位的初始值都是false。

每個(gè)位 set 都有一個(gè)當(dāng)前大小,也就是該位 set 當(dāng)前所用空間的位數(shù)。注意,這個(gè)大小與位 set 的實(shí)現(xiàn)有關(guān),所以它可能隨實(shí)現(xiàn)的不同而更改。位 set 的長(zhǎng)度與位 set 的邏輯長(zhǎng)度有關(guān),并且是與實(shí)現(xiàn)無(wú)關(guān)而定義的。

一個(gè)Bitset類創(chuàng)建一種特殊類型的數(shù)組來(lái)保存位值。BitSet中數(shù)組大小會(huì)隨需要增加。這和位向量(vectorofbits)比較類似。

這是一個(gè)傳統(tǒng)的類,但它在Java2中被完全重新設(shè)計(jì)。

BitSet定義了兩個(gè)構(gòu)造方法。

第一個(gè)構(gòu)造方法創(chuàng)建一個(gè)默認(rèn)的對(duì)象:

BitSet()

第二個(gè)方法允許用戶指定初始大小。所有位初始化為0。

BitSet(intsize)

二、Java BitSet實(shí)現(xiàn)原理

在java中,BitSet的實(shí)現(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的底層實(shí)現(xiàn)是使用long數(shù)組作為內(nèi)部存儲(chǔ)結(jié)構(gòu)的,所以BitSet的大小為long類型大小(64位)的整數(shù)倍。

它有兩個(gè)構(gòu)造函數(shù):

1、BitSet():創(chuàng)建一個(gè)新的位 set,默認(rèn)大小是64位。

public BitSet() 
{
    initWords(BITS_PER_WORD);
    sizeIsSticky = false;
}

2、BitSet(int nbits):創(chuàng)建一個(gè)位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的初始化大小,那么會(huì)把他規(guī)整到一個(gè)大于或者等于這個(gè)數(shù)字的64的整倍數(shù)。比如64位,bitset的大小是1個(gè)long,而65位時(shí),bitset大小是2個(gè)long,即128位。做這么一個(gè)規(guī)定,主要是為了內(nèi)存對(duì)齊,同時(shí)避免考慮到不要處理特殊情況,簡(jiǎn)化程序。

2:BitSet的size方法:返回此 BitSet 表示位值時(shí)實(shí)際使用空間的位數(shù),值是64的整數(shù)倍

length方法:返回此 BitSet 的“邏輯大小”:BitSet 中最高設(shè)置位的索引加 1

三、使用場(chǎng)景

常見的應(yīng)用場(chǎng)景是對(duì)海量數(shù)據(jù)進(jìn)行一些統(tǒng)計(jì)工作,比如日志分析、用戶數(shù)統(tǒng)計(jì)等。

之前在阿里的實(shí)習(xí)面試就被問(wèn)到一道題:有1千萬(wàn)個(gè)隨機(jī)數(shù),隨機(jī)數(shù)的范圍在1到1億之間?,F(xiàn)在要求寫出一種算法,將1到1億之間沒(méi)有在隨機(jī)數(shù)中的數(shù)求出來(lái)?

代碼示例如下: 

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)生的隨機(jī)數(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億不在上述隨機(jī)數(shù)中有"+bitSet.size());
		for (int i = 0; i < 100000000; i++)
		    {
			if(!bitSet.get(i))
			      {
				System.out.println(i);
			}
		}
	}
}

上述內(nèi)容就是BitSet怎么在Java中使用,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前文章:BitSet怎么在Java中使用
網(wǎng)頁(yè)鏈接:http://muchs.cn/article4/ppphoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、服務(wù)器托管、ChatGPT、自適應(yīng)網(wǎng)站、品牌網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)