Размер Java BitSet больше, чем nbits, установленный в конструкторе

Я создаю BitSet с фиксированным количеством бит. В этом случае длина моей строки, содержащей двоичное представление, составляет 508 символов.

Поэтому я создаю BitSet следующим образом:

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

Но, глядя на размер bs, я всегда получаю размер 512. Я вижу, что всегда есть 4 бита со значением 0, добавленным в конце.

Возможно, есть некоторое непонимание следующей документации:

BitSet(целое количество битов)

Создает набор битов, начальный размер которого достаточно велик для явного представления битов с индексами в диапазоне от 0 до nbits-1.

Дело в том, что BitSet всегда увеличивает свой размер, чтобы его размер был равен степени 2, или почему он больше?


person Stefan    schedule 09.10.2013    source источник


Ответы (4)


Количество битов в конструкторе — это подсказка по размеру, а не ограничение на разрешенное количество битов. size() битового набора фактически представляет собой его текущую емкость, хотя спецификация гораздо более гибкая.

Так что я не могу полагаться на размер, если я передам другой битовый набор? Также могут быть добавлены некоторые биты или они могут быть длиннее, чем «ожидалось»?

Правильно, и да.

Если вам нужен логический размер (т. е. наивысший установленный битовый индекс), используйте метод length(), а не метод size().

Если length() дает мне самый высокий набор битов, это не может помочь во всех ситуациях. Потому что «мой» старший бит в позиции 508 также может быть равен 0.

В этом случае «установить» означает «установить на 1 / true». Поэтому, если ваш старший бит (в позиции 508) равен нулю, length() будет меньше 508. Я не уверен, что это поможет. Но если у вас есть определенная концепция позиции старшего бита, вам нужно представить эту позицию как отдельное значение.

Bitset фактически моделируется как потенциально бесконечный массив битов, который по умолчанию инициализируется всеми нулями. (Вот почему нет операции «перевернуть весь набор битов». Это потребовало бы огромного объема памяти.)

person Stephen C    schedule 09.10.2013
comment
Так что я не могу полагаться на размер, если я передам другой битовый набор? Также могут быть добавлены некоторые биты или они могут быть длиннее, чем ожидалось? - person Stefan; 09.10.2013
comment
Спасибо, что последовали за комментарием. Если length() дает мне самый высокий набор битов, это не может помочь во всех ситуациях. Потому что мой самый старший бит на позиции 508 тоже может быть 0. Но теперь я понимаю немного больше и должен придумать дополнительный способ решить эту проблему. Спасибо. - person Stefan; 09.10.2013

Согласно документации, фактический размер в память зависит от реализации, поэтому вы не можете точно знать, что size() вы собираетесь получить. Однако вам, как пользователю, не следует беспокоиться об этом, потому что length() в BitSet всегда точен — даже если размер в памяти больше, он возвращает количество фактически используемых битов.

Поскольку BitSet может автоматически увеличиваться для размещения любых добавленных к нему данных, я не удивлюсь, если он использует стратегию роста, аналогичную спискам, которые имеют тенденцию использовать возрастающие степени двойки. Но, как было сказано, этот факт является деталью реализации, и он может быть не везде и не всегда одинаковым.

person Matti Virkkunen    schedule 09.10.2013

Это просто подсказка для коллекции (это относится ко всем коллекциям, я думаю), поэтому ей не нужно изменять размер после добавления элементов. Например, если вы знаете, что ваша коллекция будет содержать не более 100 элементов, вы можете установить ее размер равным 100, и размер не будет изменен, что лучше для производительности.

person Petr Mensik    schedule 09.10.2013

Размер BitSet будет равен первому кратному 64 числу, равному или превышающему число, которое вы используете для «размера». Если вы укажете «размер» 508, вы получите BitSet с фактическим размером 512, что является следующим наибольшим числом, кратным 64.

person Mark Ross    schedule 28.06.2014