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…
T
thingol
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.
mari_sm
É 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?
mari_sm
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
T
thingol
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.
mari_sm
sim sim, entendi, mas não sei se o enfeiamento do código compensa o espaço economizado no meu caso.
T
thingol
Por exemplo, digamos que você queira simular em Java algo como
vararr: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).