1. Qu'est-ce que Bitset?
Remarque: Le contenu suivant vient de l'API JDK:
La classe Bitset implémente un vecteur bit qui se développe à la demande. Chaque composant de l'ensemble de bits a une valeur booléenne. Indexez les bits de bits avec des entiers non négatifs. Chaque bit indexé peut être testé, défini ou effacé. Grâce à des opérations XOR logiques et logiques ou logiques, un ensemble de bits peut être utilisé pour modifier le contenu d'un autre ensemble de bits.
Par défaut, les valeurs initiales de tous les bits dans SET sont fausses.
Chaque ensemble de bits a une taille de courant, c'est-à-dire le nombre de bits de l'espace actuel utilisé par l'ensemble de bits. Notez que cette taille est liée à la mise en œuvre de BitsET, elle peut donc changer avec l'implémentation. La longueur d'un ensemble est lié à la longueur logique d'un ensemble et est définie indépendante de la mise en œuvre.
Une classe BitSet crée un type spécial de tableau pour maintenir les valeurs de bit. La taille du tableau dans Bitset augmentera au besoin. Ceci est similaire au vecteur de bits (vectorofbits).
Il s'agit d'une classe traditionnelle, mais elle a été complètement repensée dans Java2.
Bitset définit deux constructeurs.
Le premier constructeur crée un objet par défaut:
BitSet()
La deuxième méthode permet à l'utilisateur de spécifier la taille initiale. Tous les bits sont initialisés à 0.
BitSet(intsize)
2. Principe de mise en œuvre de Java Bitset
En Java, la mise en œuvre de Bitset est située dans le package Java.util:
Classe publique Bitset implémente clonable, java.io.serializable {private final static int adresse_bits_per_word = 6; private final static int bits_per_word = 1 << adresse_bits_per_word; privé final static int bit_index_mask = bits_per_word - 1; / * utilisé à gauche ou à droite pour un masque de mots partiel * 0xFFFFFFFFFFFFFFFL; Private Static Final ObjectStreamField [] SerialPersistentFields = {new ObjectStreamField ("bits", long []. Class),}; / ** * Le champ interne correspondant au SerialField "bits". * / Private Long [] mots; .....}Comme vous pouvez le voir, l'implémentation sous-jacente de BitsET utilise des tableaux longs comme structure de stockage interne, de sorte que la taille de Bitset est un multiple entier de la taille de type long (64 bits).
Il a deux constructeurs:
1. BitSet (): Créez un nouvel ensemble de bits, la taille par défaut est de 64 bits.
public bitset () {initWords (bits_per_word); sizeSsticky = false;}2. BitSet (int nbits): créez un ensemble de bits dont la taille initiale est suffisante pour représenter explicitement les bits avec une plage d'index de 0 à NBITS-1.
Public BitSet (int nbits) {// nbits ne peut pas être négatif; La taille 0 est ok si (nbits <0) lance un nouveau négativeArraySizeException ("nbits <0:" + nbits); InitWORDS (NBITS); sizeSsticky = true; }Note:
1. Si la taille d'initialisation de BitsET est spécifiée, elle sera régularisée en un entier supérieur ou égal à 64 de ce nombre. Par exemple, pour 64 bits, la taille de Bitset est de 1 long, tandis que pour 65 bits, la taille de Bitset est de 2 longs, c'est-à-dire 128 bits. Ce règlement est principalement destiné à l'alignement de la mémoire, tout en évitant la prise en compte de ne pas traiter avec des circonstances particulières et de simplifier le programme.
2: Méthode de taille de Bitset: Renvoie cet ensemble de bits pour représenter le nombre réel de bits utilisés lorsque la valeur de bit est un multiple entier de 64.
Méthode de longueur: Renvoie la "taille logique" de cet ensemble de bits: l'index du bit de jeu le plus élevé de l'ensemble de bits est ajouté par 1
3. Utilisez des scénarios
Un scénario d'application commun consiste à effectuer des travaux statistiques sur des données massives, telles que l'analyse des journaux, le comptage des utilisateurs, etc.
On m'a posé une question avant l'entretien de stage avec Alibaba: il y a 10 millions de nombres aléatoires, et la gamme de nombres aléatoires se situe entre 100 millions et 100 millions. Maintenant, j'ai besoin d'écrire un algorithme pour découvrir les chiffres entre 100 millions et 100 millions qui ne sont pas en nombre aléatoire?
L'exemple de code est le suivant:
classe publique Alibaba {public static void main (String [] args) {random random = new random (); list <perger> list = new ArrayList <> (); for (int i = 0; i <10000000; i ++) {int randomresult = random.nextint (1000000000); list.add (randomresult);} system.out.out.printLn ("le random généré. pour (int i = 0; i <list.size (); i ++) {System.out.println (list.get (i));} bitset bitset = new bitset (100000000); pour (int i = 0; i <10000000; i ++) {bitset.set (list.get (i));} system.out.out.println ("0 pour 100 millions nombres "+ bitset.size ()); for (int i = 0; i <100000000; i ++) {if (! bitset.get (i)) {System.out.println (i);}}}}Résumer
Ce qui précède concerne cet article en discutant des scénarios d'utilisation et des exemples de code de Java Bitset, et j'espère qu'il sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!