1. Что такое битсет?
Примечание. Следующий контент поступает из API JDK:
Класс битсет внедряет немного вектора, который растет по требованию. Каждый компонент битсет имеет логическое значение. Индексировать биты битсета с неотрицательными целыми числами. Каждый индексированный бит может быть проверен, устанавливается или очищен. Благодаря логическим и логическим или логическим операциям XOR можно использовать один битсет для изменения содержания другого бица.
По умолчанию начальные значения всех битов в наборе являются false.
Каждый набор битов имеет текущий размер, то есть количество бит текущего пространства, используемого набором битов. Обратите внимание, что этот размер связан с реализацией Bitset, поэтому он может измениться с помощью реализации. Длина немного набора связана с логической длиной набора битов и определяется независимо от реализации.
Класс битсет создает специальный тип массива для сохранения значений битов. Размер массива в битсе будет увеличиваться по мере необходимости. Это похоже на вектор битов (Vectorofbits).
Это традиционный класс, но он был полностью переработан в Java2.
Битсет определяет два конструктора.
Первый конструктор создает объект по умолчанию:
BitSet()
Второй метод позволяет пользователю указать начальный размер. Все биты инициализированы до 0.
BitSet(intsize)
2. Принцип реализации Java Bitset
В Java реализация Bitset находится в пакете java.util:
Публичный класс битсет реализует клонируемые, java.io.serializable {private final static ind address_bits_per_word = 6; private final int int bits_per_word = 1 << address_bits_per_word; private final int bit_index_mask = bits_per_word - 1;/ * Используется для сдвига влево или правого для части Partial Mask */private statis */private static = private */private */private static */static. 0xfffffffffffffffffl; Private Static Final ObjectStreamfield [] SerialPersistEntfields = {new ObjectStreamfield ("bits", long []. Class),};/*** Внутреннее поле, соответствующее серийному поле "Bits". */private long [] слова; .....}Как вы можете видеть, основная реализация Bitset использует длинные массивы в качестве внутренней структуры хранения, поэтому размер битсет является целым числом, кратно от размера длинного типа (64-битный).
У него есть два конструктора:
1. Bitset (): Создайте новый набор битов, размер по умолчанию составляет 64 бита.
public bitset () {initionwords (bits_per_word); sizeIshicky = false;}2. Bitset (int nbits): Создайте немного набора, начальный размер которого достаточно, чтобы явно представлять биты с диапазоном индексов от 0 до NBITS-1.
public bitset (int nbits) {// nbits не могут быть отрицательными; Размер 0 - это нормально, если (nbits <0) бросить новый негативное размер. initionwords (nbits); sizeIshicky = true; }Примечание:
1. Если указан размер инициализации битсета, он будет упорядочен на целое число, больше или равно 64 этого числа. Например, для 64 бит размер битсета составляет 1 длину, а для 65 бит размер битсет - 2 длина, то есть 128 бит. Это регулирование предназначено в основном для выравнивания памяти, избегая при этом рассмотрения не иметь никакого отношения к особым обстоятельствам и упростить программу.
2: Метод размера Битсет: возвращает этот битсет, чтобы представить фактическое количество битов, используемых, когда битовое значение составляет целое число из 64.
Метод длины: вернуть «логический размер» этого битсета: индекс самого высокого состава в битсе добавляется 1
3. Используйте сценарии
Общий сценарий приложения заключается в том, чтобы провести некоторую статистическую работу по массовым данным, таким как анализ журналов, подсчет пользователей и т. Д.
Перед интервью с Alibaba мне задавали вопрос: есть 10 миллионов случайных чисел, а диапазон случайных чисел составляет от 100 до 100 миллионов. Теперь мне нужно написать алгоритм, чтобы выяснить цифры от 100 до 100 миллионов, которые не находятся в случайных числах?
Пример кода заключается в следующем:
открытый класс alibaba {public static void main (string [] args) {случайный случайный = new random (); list <Integer> list = new Arraylist <> (); для (int i = 0; i <10000000; i ++) {int randomResult = random.nextint (1000000000); size.Add (randomResult); for (int i = 0; i <list.size (); i ++) {System.out.println (list.get (i));} bitset bitset = new Bitset (10000000000); для (int i = 0; i <1000000000; i ++) {bitset.set (list.get (i);} system Числа "+bitset.size ()); for (int i = 0; i <10000000000; i ++) {if (! bitset.get (i)) {System.out.println (i);}}}}Суммировать
Выше приведено в этой статье, обсуждающих сценарии использования и примеры кода Java Bitset, и я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!