根据BitSet
实现,它在内部使用long数组:
/**
* The internal field corresponding to the serialField "bits".
*/
private long[] words;
但是对于set
方法,它使用int:
public void set(int bitIndex) {...}
因此,基本上,我们可以存储2,147,483,642 * 64 = 137,438,953,088 bits
,但是我们只能访问前2,147,483,648
位。
此逻辑背后的意义是什么?
通常,您使用位集来索引其他内容。假设您使用此位集索引到数组中。在最大BitSet索引下,该数组将包含2,147,483,648个元素,并且它将至少使用2GB的RAM(假设每个元素至少需要1个字节的存储空间),这将使Java崩溃。
每个64位块被打包成long,而不是每个bit索引长一个,因此,在调用set(int index)时,long []字数组的长度将最多使用带有int索引的268,435,456字节