BitSet怎么在Java中使用

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

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名申請、網頁空間、營銷軟件、網站建設、新化網站維護、網站推廣。

一、什么是BitSet?

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;
	/* 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的底層實現是使用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億之間?,F在要求寫出一種算法,將1到1億之間沒有在隨機數中的數求出來?

代碼示例如下: 

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

上述內容就是BitSet怎么在Java中使用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創新互聯行業資訊頻道。

當前文章:BitSet怎么在Java中使用
網頁鏈接:http://m.kartarina.com/article4/ppphoe.html

成都網站建設公司_創新互聯,為您提供關鍵詞優化、服務器托管ChatGPT自適應網站品牌網站建設、標簽優化

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

微信小程序開發
主站蜘蛛池模板: 国产成人无码午夜福利软件| 亚洲真人无码永久在线观看| 中文无码精品A∨在线观看不卡| 久久久久亚洲AV无码麻豆| 无码人妻精品一区二区蜜桃网站| 在线观看无码不卡AV| 国产亚洲大尺度无码无码专线 | 黄桃AV无码免费一区二区三区| 中文字幕无码日韩专区| 久久水蜜桃亚洲AV无码精品| 亚洲精品无码不卡在线播放HE| 人妻丰满熟妇AV无码区免| 特级无码毛片免费视频尤物| 国产精品无码素人福利不卡| 国产丰满乱子伦无码专| 无码AV波多野结衣久久| 亚洲级αV无码毛片久久精品| 亚洲AV无码一区二区三区鸳鸯影院| 伊人久久综合无码成人网| 亚洲一级特黄无码片| 国产精品无码av天天爽| 亚洲另类无码专区首页| 无码av人妻一区二区三区四区| 国产爆乳无码一区二区麻豆 | 性色AV蜜臀AV人妻无码| 亚洲av无码久久忘忧草| 亚洲AV无码日韩AV无码导航| 亚洲人成人无码网www电影首页 | 亚洲国产成人无码av在线播放 | 中文字幕无码乱人伦| 超清无码无卡中文字幕| 无码办公室丝袜OL中文字幕| 无码中文字幕一区二区三区| 亚洲av无码专区在线电影天堂| 无码福利写真片视频在线播放| 久久无码AV一区二区三区| 亚洲av无码不卡久久| 亚洲av专区无码观看精品天堂 | 无码人妻精一区二区三区| 日韩精品成人无码专区免费| 国产成人无码AV在线播放无广告|