簡體   English   中英

Java BitSet的大小大於構造函數中設置的nbits

[英]Java BitSet size larger then nbits set in Constructor

我正在創建一個具有固定位數的BitSet。 在這種情況下,包含二進制表示形式的String的長度為508個字符。

因此,我通過以下方式創建BitSet:

BitSet bs = new BitSet(binary.length());
// binary.length() = 508

但是看bs的大小,我總是得到512的大小。我可以看到總是在末尾附加4位,值為0。

可能對以下文檔有一些誤解:

BitSet(整數位)

創建一個位集合,其初始大小足夠大,以明確表示索引范圍在0到nbits-1之間的位。

是BitSet總是增加其大小以使其大小為2的冪還是為什么更大?

構造函數中的位數只是一個大小提示,而不是對所允許位數的限制。 Bitset的size()實際上是其當前容量 ,盡管規范比之更具彈性。

因此,如果我通過另一個位集,我就不能依靠大小嗎? 可能還會附加一些位,或者可能比“預期”長一些?

正確,是的。

如果要邏輯大小(即設置的最高位索引),請使用length()方法,而不要使用size()方法。

如果length()給了我最高的設置,這在每種情況下都無濟於事。 因為位置508上的“我”最高位也可以為0。

在這種情況下,“設置”表示“設置為1 / true”。 因此,如果您的最高位(在位置508)為零,則length()將小於508。我不確定這是否有幫助。 但是,如果定義了最高位位置的概念,則需要將該位置表示為單獨的值。

實際上,將位集建模為潛在的無限位數組,其默認初始化為全零。 (這就是為什么沒有“翻轉整個Bitset”操作的原因。它將占用大量存儲空間。)

根據文檔 ,內存的實際大小取決於實現,因此您無法確定要獲得的size() 但是,作為用戶,您不必擔心,因為BitSet的length()始終是准確的-即使內存中的大小較大,它也會返回實際使用的位數。

由於BitSet可以自動增長以適應添加到其中的任何數據,因此,如果它使用與列表相似的增長策略(往往使用遞增的2的冪),我不會感到驚訝。 但是,正如所說的,這是一個實現細節,在每個地方和每次都可能並不相同。

這只是一個集合的提示(這適用於我認為的所有集合),因此添加元素后不必調整自身大小。 例如,如果您知道您的集合最多可容納100個元素,則可以將其大小設置為100,並且不會進行任何調整以提高性能。

BitSet大小將被設置為64的第一個倍數,該值等於或大於您用於“大小”的數字。 如果將“大小”指定為508,則將獲得一個實際大小為512的BitSet,這是64的下一個最大倍數。

暫無
暫無

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

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