1. O que é Bitset?
Nota: O conteúdo a seguir vem da API JDK:
A classe Bitset implementa um vetor bit que cresce sob demanda. Cada componente do bitset tem um valor booleano. Indexem os bits de bitset com números inteiros não negativos. Cada bit indexado pode ser testado, definido ou limpo. Por meio de operações XOR lógicas e lógicas ou lógicas, um bitset pode ser usado para modificar o conteúdo de outro bitset.
Por padrão, os valores iniciais de todos os bits no conjunto são falsos.
Cada conjunto de bits tem um tamanho atual, ou seja, o número de bits do espaço atual usado pelo conjunto de bits. Observe que esse tamanho está relacionado à implementação do bitset, para que possa mudar com a implementação. O comprimento de um conjunto de bits está relacionado ao comprimento lógico de um bit e é definido independentemente da implementação.
Uma classe Bitset cria um tipo especial de matriz para manter valores de bits. O tamanho da matriz no bitset aumentará conforme necessário. Isso é semelhante ao vetor de bit (Vectorofbits).
Esta é uma classe tradicional, mas foi completamente redesenhada em Java2.
Bitset define dois construtores.
O primeiro construtor cria um objeto padrão:
BitSet()
O segundo método permite ao usuário especificar o tamanho inicial. Todos os bits são inicializados para 0.
BitSet(intsize)
2. Java Bitset Princípio de implementação
Em Java, a implementação do Bitset está localizada no pacote java.util:
A classe pública Bitset implementa clonável, java.io.Serializable {private final estático int adedsed_bits_per_word = 6; private final estático final bits_per_word = 1 << ADDME_BITS_PER_DORD; private final static int bit_index_Mask = BITS_PERDWWORD - 1;/ * Usado para mudar esquerda 0xffffffffffffffffl; private estático final ObjectStreamfield [] serialPerSistentFields = {new ObjecjotStreamfield ("bits", Long []. Class),};/*** O campo interno correspondente ao campo serial "bits". */Private Long [] palavras; .....}Como você pode ver, a implementação subjacente do bitset usa matrizes longas como a estrutura de armazenamento interno, de modo que o tamanho do bitset é um múltiplo inteiro do tamanho do tipo longo (64 bits).
Tem dois construtores:
1. Bitset (): Crie um novo conjunto de bits, o tamanho padrão é de 64 bits.
public bitset () {initwords (bits_per_word); sizeIssticky = false;}2. Bitset (int nbits): Crie um conjunto de bits cujo tamanho inicial é suficiente para representar explicitamente bits com um intervalo de índice de 0 a NBITs-1.
public bitset (int nbits) {// nbits não podem ser negativos; O tamanho 0 está ok se (nbits <0) lançar novo negativoRraysizeException ("nbits <0:" + nbits); initwords (nbits); sizeIssticky = true; }Observação:
1. Se o tamanho da inicialização do bitset for especificado, ele será regularizado para um número inteiro maior ou igual a 64 desse número. Por exemplo, para 64 bits, o tamanho do bitset tem 1 comprimento, enquanto para 65 bits, o tamanho do bitset tem 2 de comprimento, ou seja, 128 bits. Esse regulamento é principalmente para o alinhamento da memória, evitando a consideração de não lidar com circunstâncias especiais e simplificar o programa.
2: Método de tamanho do bitset: Retorna este bitset para representar o número real de bits usados quando o valor do bit é um múltiplo inteiro de 64.
Método de comprimento: Retorne o "tamanho lógico" deste bitset: o índice do bit mais alto do Bitset é adicionado por 1
3. Use cenários
Um cenário de aplicação comum é realizar algum trabalho estatístico sobre dados maciços, como análise de log, contagem de usuários, etc.
Fiquei feita uma pergunta antes da entrevista de estágio com o Alibaba: existem 10 milhões de números aleatórios, e o intervalo de números aleatórios é entre 100 e 100 milhões. Agora eu preciso escrever um algoritmo para descobrir os números entre 100 milhões e 100 milhões que não estão em números aleatórios?
O exemplo do código é o seguinte:
classe pública alibaba {public static void main (string [] args) {aleatório aleatório = new Random (); list <Teger> list = new ArrayList <> (); para (int i = 0; i <10000000; i ++) {int randomResult = Random.nextInt (1000000.000); list.add (RandomRsUr); para (int i = 0; i <list.size (); i ++) {system.out.println (list.get (i));} bitset bitset = new bitset (100000000); para (int i = 0; i <10000000; i ++) {bitset.set (list.get (i); números "+bitset.size ()); para (int i = 0; i <100000000; i ++) {if (! bitset.get (i)) {System.out.println (i);}}}}Resumir
O exposto acima é sobre este artigo discutindo os cenários de uso e exemplos de código de Java Bitset, e espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!