簡體   English   中英

為什么我的BitSet的大小為0?

[英]Why does my BitSet have a size of 0?

這是我的代碼。 我想做的是使用BitSet處理來自ByteBuffer的字節。 ByteBuffer是從DynamoDB(使用DynamoDBMapper)加載的

    ByteBuffer buffer = .......
    System.out.println("Array length is " + buffer.array().length);
    BitSet bitSet = BitSet.valueOf(buffer.array());
    System.out.println("Bit set size is " + bitSet.size());

當我執行代碼時,我發現ByteBuffer的數組長度為6100,這意味着它支持6100個字節。 這些字節全為0。 但是我也看到位設置大小為0。這對我來說沒有意義。(大小應為6100 * 8)。

我查看了valueOf的文檔和“返回包含給定字節數組中所有位的新位集”的描述。 對於我要做什么有意義。

我犯的第一個錯誤是使用位集的長度。 長度為0,這是有道理的,因為所有位均為0。 大小函數“返回此BitSet實際使用的表示位數的空間位數”。 size函數不應該在這里返回6100 * 8嗎?

更新:我只是嘗試將所有1放入字節緩沖區,現在得到的數組長度為7000,位大小為7232

未實現BitSet來直接維護一個緩沖區,該緩沖區的大小等於傳遞給它初始化的數組的大小。 相反,它在內部僅保留足夠的緩沖區空間來跟蹤打開的最高位。 對於高於此值的任何位,如BitSet#get類的方法BitSet#get假定,如果傳遞的位索引高於其當前緩沖區中所保持的位索引,則該位必須為off。

JavaDocs中有一些有關“大小”或“長度”的相關聲明。 BitSet的類級JavaDocs中:

每個位集都有一個當前大小,即當前由位集使用的空間的位數。 請注意,大小與位集的實現有關,因此它可能隨實現而變化。 位集合的長度與位集合的邏輯長度有關,並且獨立於實現來定義。

BitSet#length

返回此BitSet的“邏輯大小”:BitSet中最高設置位的索引加1。 如果BitSet不包含任何設置位,則返回零。

(還要注意,在所有位都關閉的極端情況下,它返回零。)

BitSet#size

返回此BitSet實際使用的表示位數的空間位數。 集合中的最大元素是size-第一個元素。

如果您對更深入的研究感興趣,我還建議您查看BitSet的OpenJDK代碼:

http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/3462d04401ba/src/share/classes/java/util/BitSet.java

set有趣的部分,該部分根據需要動態擴展緩沖區空間以設置特定位,並get ,如果所請求的位索引超出當前緩沖區容量( words成員變量),則將其編碼為false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM