Queria saber se, caso eu instancie um objeto da classe bitset com sei lá, 10 bits, o espaço ocupado será de fato 10 bits ? Ou será que a classe não é implementada de outra forma no qual acaba gastando mais? Tipo, talvez a implementacao dessa classe acabe obrigando a usar 2 bytes para um bitset de 10 bits …
Pergunto isso porque quero economizar espaço de memória numa aplicação minha, e caso realmente um bitset de 10 bits tenha apenas 10 bits, dai sim valerá a pena a refatoração do código.
Economizar espaço com java… É uma coisa que não encaixa mt bem rsrsrs. A infeliz da JVM toma conta da memória mas enfim… Talvez alguem com mais experiência em java possa te dizer…
Leia o código-fonte da classe java.util.BitSet. Se não me engano, cada BitSet é construído da seguinte maneira:
- Os bits são guardados em arrays de long (64 bits = 8 bytes)
- Cada long pode armazenar até 64 bits
- Ou seja, se você criar um BitSet (10), ele usa um array de 1 long (já que não dá para termos um array de 1/2 long, por exemplo).
De qualquer maneira, você realmente vai economizar bastante memória, porque se você tiver um BitSet de 1 milhão de bits, então serão usados 1.000.000 / 64 = 15625 longs, ou seja, 125000 bytes - a alocação ótima nesse caso.
É que eu tenho que implementar uma matriz meio grande, e to usando vetor de byte. Ja pensei em usar vetor de boolean tb, mas será que não dá na mesma em termos de gasto de memória?
mas no caso eu quero fazer uma matriz de bitsets … ai acho que nao vale a pena se cada linha for com 1o bits por exemplo
Se você tiver uma matriz bidimensional de bits, então você pode usar um BitSet, mas calculando os índices correspondentes. É um pouco chato mas pode ser encapsulado sem problemas, e isso lhe dará o melhor empacotamento possível se sua matriz não for esparsa.
sim sim, entendi, mas não sei se o enfeiamento do código compensa o espaço economizado no meu caso.
Por exemplo, digamos que você queira simular em Java algo como
var arr : bit (3000,2000)
ou seja, você quer uma matriz de 6 megabits.
Você pode criar um BitSet (6000000), e calcular um índice sobre esse bitset. Você vai ter de fazer algumas multiplicações e somas, mas nos processadores mais modernos é mais rápido fazer uma multiplicação que ficar seguindo ponteiros (como seria o caso de criar um array de arrays, que é o caso do Java).