亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談Java BitSet使用場景和代碼示例

 更新時間:2017年12月08日 16:14:41   作者:溫布利往事  
這篇文章主要介紹了淺談Java BitSet使用場景和代碼示例,具有一定借鑒價值,需要的朋友可以參考下。

一、什么是BitSet?

  注:以下內容來自JDK API:

  BitSet類實現了一個按需增長的位向量。位Set的每一個組件都有一個boolean值。用非負的整數將BitSet的位編入索引??梢詫γ總€編入索引的位進行測試、設置或者清除。通過邏輯與、邏輯或和邏輯異或操作,可以使用一個 BitSet修改另一個 BitSet的內容。

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

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

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

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

BitSet定義了兩個構造方法。

第一個構造方法創(chuàng)建一個默認的對象:

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():創(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ī)整到一個大于或者等于這個數字的64的整倍數。比如64位,bitset的大小是1個long,而65位時,bitset大小是2個long,即128位。做這么一個規(guī)定,主要是為了內存對齊,同時避免考慮到不要處理特殊情況,簡化程序。

  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<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);
			}
		}
	}
}

總結

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

您可能感興趣的文章:

相關文章

  • springMvc請求的跳轉和傳值的方法

    springMvc請求的跳轉和傳值的方法

    本篇文章主要介紹了springMvc請求的跳轉和傳值的方法,這里整理了幾種跳轉方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • JDBC鏈接數據庫的幾個步驟

    JDBC鏈接數據庫的幾個步驟

    這篇文章主要介紹了JDBC鏈接數據庫的幾個步驟,通過將數據庫的連接放在一個工具類里面,達到重用的效果,需要的朋友可以參考下
    2015-07-07
  • Java Spring Boot實現簡易掃碼登錄詳解

    Java Spring Boot實現簡易掃碼登錄詳解

    這篇文章主要為大家詳細介紹了java Spring Boot實現app掃碼登錄功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-09-09
  • SpringBoot快速集成Logback日志組件

    SpringBoot快速集成Logback日志組件

    本文主要介紹了SpringBoot快速集成Logback日志組件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • 關于log4j2的異步日志輸出方式

    關于log4j2的異步日志輸出方式

    這篇文章主要介紹了關于log4j2的異步日志輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 一文精通Java中的volatile關鍵字

    一文精通Java中的volatile關鍵字

    volatile是java中的關鍵詞之一,這篇文章主要給大家介紹了關于Java中volatile關鍵字的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • 在Java編程中使用正則表達式

    在Java編程中使用正則表達式

    這篇文章主要介紹了在Java編程中使用正則表達式,注意使用matches()方法檢測一下Java對正則表達式的支持情況,需要的朋友可以參考下
    2015-08-08
  • MyBatis中的mapper.xml配置教程

    MyBatis中的mapper.xml配置教程

    這篇文章主要介紹了MyBatis中的mapper.xml配置,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • 基于Java寫minio客戶端實現上傳下載文件

    基于Java寫minio客戶端實現上傳下載文件

    這篇文章主要介紹了基于Java寫minio客戶端實現上傳下載文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Java實現實時視頻轉播的代碼示例

    Java實現實時視頻轉播的代碼示例

    這篇文章主要給大家詳細介紹了Java如何實現實時視頻轉播,文中通過代碼實例介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴可以自己動手試一試
    2023-09-09

最新評論