Согласно реализации BitSet
, он внутренне использует массив longs:
/**
* The internal field corresponding to the serialField "bits".
*/
private long[] words;
Но для метода set
он использует int:
public void set(int bitIndex) {...}
Итак, в основном мы можем хранить (2^31 - 1) * 64 * 8 = 2,147,483,642 * 64 * 8 = 137,438,953,088 bits
, но при индексировании int
мы имеем доступ только к первым 2,147,483,648
битам.
Это означает, что 137,438,953,088 - 2,147,483,648 = 135,291,469,440
битов недоступны.
Но если бы разработчики этого класса использовали long
вместо int
для индексации битов, это решило бы все проблемы, поскольку с long
мы можем перемещаться по корыту 2^63 - 1 = 9,223,372,036,854,775,807 bits
Это не имеет никакого смысла даже с точки зрения производительности.
Что за логические причины c использования int
вместо из long
для индексации и пропущенных миллиардов бит?
PS Можно сказать, что проблема в размере 2 GiB
кучи, но сегодня это больше не проблема.