1. ¿Qué es Bitset?
Nota: El siguiente contenido proviene de la API JDK:
La clase Bitset implementa un vector de bits que crece a pedido. Cada componente del bitset tiene un valor booleano. Indexe los bits de bitset con enteros no negativos. Cada bit indexado se puede probar, establecer o borrar. A través de operaciones XOR lógicas y lógicas o lógicas, se puede usar un bitset para modificar el contenido de otro bitset.
Por defecto, los valores iniciales de todos los bits en SET son falsos.
Cada conjunto de bits tiene un tamaño actual, es decir, el número de bits del espacio actual utilizado por el conjunto de bits. Tenga en cuenta que este tamaño está relacionado con la implementación de Bitset, por lo que puede cambiar con la implementación. La longitud de un conjunto de bits está relacionada con la longitud lógica de un conjunto de bits y se define independientemente de la implementación.
Una clase Bitset crea un tipo especial de matriz para mantener los valores de bits. El tamaño de la matriz en Bitset aumentará según sea necesario. Esto es similar al vector de bits (VectorOfBits).
Esta es una clase tradicional, pero se ha rediseñado completamente en Java2.
Bitset define dos constructores.
El primer constructor crea un objeto predeterminado:
BitSet()
El segundo método permite al usuario especificar el tamaño inicial. Todos los bits se inicializan a 0.
BitSet(intsize)
2. Principio de implementación de Java Bitset
En Java, la implementación de Bitset se encuentra en el paquete java.util:
public class BitSet implements Cloneable, java.io.Serializable {private final static int ADDRESS_BITS_PER_WORD = 6;private final static int BITS_PER_WORD = 1 << ADDRESS_BITS_PER_WORD;private final static int BIT_INDEX_MASK = BITS_PER_WORD - 1;/* Used to shift left or right for a partial word mask */private static final long WORD_MASK = 0xfffffffffffffffl; private static final ObjectStreamfield [] SerialPersistentFields = {new ObjectStreamField ("bits", long []. Class),};/*** El campo interno correspondiente a los "bits" serialfield. */Private Long [] palabras; .....}Como puede ver, la implementación subyacente de Bitset utiliza matrices largas como estructura de almacenamiento interno, por lo que el tamaño de Bitset es un múltiplo entero del tamaño de tipo largo (64 bits).
Tiene dos constructores:
1. Bitset (): cree un nuevo conjunto de bits, el tamaño predeterminado es de 64 bits.
public bitset () {initWords (bits_per_word); sizeissticky = false;}2. Bitset (int nbits): cree un conjunto de bits cuyo tamaño inicial sea suficiente para representar explícitamente bits con un rango de índice de 0 a NBITS-1.
public bitset (int nbits) {// nbits no puede ser negativo; El tamaño 0 está bien si (nbits <0) tire nuevo negativeRearraSizeException ("nbits <0:" + nbits); InitWords (NBITS); sizeissticky = true; }Nota:
1. Si se especifica el tamaño de inicialización de Bitset, se regularizará a un entero mayor o igual a 64 de este número. Por ejemplo, para 64 bits, el tamaño de Bitset es de 1 largo, mientras que para 65 bits, el tamaño de Bitset es de 2 de largo, es decir, 128 bits. Esta regulación es principalmente para la alineación de la memoria, al tiempo que evita la consideración de no lidiar con circunstancias especiales y simplificar el programa.
2: Método de tamaño de Bitset: Devuelve este bitset para representar el número real de bits utilizados cuando el valor de bit es un múltiplo entero de 64.
Método de longitud: Devuelva el "tamaño lógico" de este bitset: el índice del bit más alto en el bitset se agrega por 1
3. Use escenarios
Un escenario de aplicación común es realizar algún trabajo estadístico sobre datos masivos, como análisis de registro, conteo de usuarios, etc.
Me hicieron una pregunta antes de la entrevista de pasantía con Alibaba: hay 10 millones de números aleatorios, y el rango de números aleatorios es de entre 100 millones y 100 millones. ¿Ahora necesito escribir un algoritmo para descubrir los números entre 100 millones y 100 millones que no están en números aleatorios?
El ejemplo del código es el siguiente:
clase pública Alibaba {public static void main (string [] args) {random random = new Random (); list <Integer> list = new ArrayList <> (); for (int i = 0; i <10000000; i ++) {int randomResult = random.nextint (100000000000); list.add (randomResult);} System.out.Println (The Generated (Its Its "); for (int i = 0; i <list.size (); i ++) {system.out.println (list.get (i));} bitset bitset = new bitset (10000000000); for (int i = 0; i <10000000; i ++) {bitset.set (list.get (i));} System.out.println ("0 a 100 a los 100 de los millones no se incluyen en el azar el azar en el azar en el azar en el azar en la lista de listas (i);} números "+bitset.size ()); para (int i = 0; i <100000000; i ++) {if (! bitset.get (i)) {System.out.println (i);}}}}Resumir
Lo anterior se trata de este artículo que discute los escenarios de uso y los ejemplos de código de Java Bitset, y espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!