激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 淺談Java BitSet使用場景和代碼示例

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

2021-03-02 10:46溫布利往事 Java教程

這篇文章主要介紹了淺談Java BitSet使用場景和代碼示例,具有一定借鑒價值,需要的朋友可以參考下。

一、什么是BitSet

  注:以下內容來自JDK API:

  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包中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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位。

?
1
2
3
4
5
public BitSet()
{
    initWords(BITS_PER_WORD);
    sizeIsSticky = false;
}

 2、BitSet(int nbits):創建一個位set,它的初始大小足以顯式表示索引范圍在 0 到 nbits-1 的位。

?
1
2
3
4
5
6
7
8
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億之間。現在要求寫出一種算法,將1到1億之間沒有在隨機數中的數求出來?

  代碼示例如下: 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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使用場景和代碼示例的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://www.cnblogs.com/xujian2014/p/5491286.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美精品18videos性欧美 | 手机黄色小视频 | 久草在线视频福利 | 国产亚洲精品影达达兔 | 中文字幕亚洲一区二区三区 | 粉嫩蜜桃麻豆免费大片 | 国产精品久久久毛片 | 91精品国产777在线观看 | 久久精品2019中文字幕 | 激情亚洲一区二区 | 91快色| av在线播放地址 | 国产一区免费观看 | 久久精品视频日本 | 免费h片| 国产精品久久久久久久娇妻 | 黑人操穴 | 香蕉黄色网 | 日韩黄色影视 | 蜜桃视频在线入口www | 在线观看福利网站 | 成人性视频欧美一区二区三区 | 欧美激情精品久久久久久久久久 | 久艹在线视频 | 欧美一级免费在线观看 | 欧美成人免费看 | 成人影片在线免费观看 | 91九色福利 | 激情综合在线 | 国产精品白嫩白嫩大学美女 | 国产亚洲精品综合一区91555 | 国产午夜电影 | 欧美成人毛片 | 欧美三级美国一级 | 久久tv免费国产高清 | 欧产日产国产精品乱噜噜 | 99这里精品 | 999精品国产| 成人午夜激情视频 | 免费在线一区二区 | 国产亚洲欧美日韩高清 |