2012-01-13 4 views
6

Mój algorytm używa ogromnej tablicy boolean, a jak mnie uczono, zajmuje 1 bajt dla każdej zmiennej boolowskiej. Czy istnieje mimo to zadeklarować tablicę boolowską i zmniejszyć zużycie pamięci, ponieważ pracuję w środowisku telefonicznym.Czy można zadeklarować zmienną 1-bitową w Javie?

EDYCJA: Mój przyjaciel i ja dyskutujemy, czy BitSet jest wolniejszy niż normalna tablica Boolean. Proszę to wyjaśnić. Algorytm nadal wymaga wydajności, jak najlepiej.

+12

[java.util.BitSet] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/BitSet.html)? Czy może czegoś brakuje? – Mysticial

+2

Geez ... Powinienem przestać się zastanawiać i opublikować te odpowiedzi ... – Mysticial

+2

@Mysticial: Bądź nieco bardziej niezdecydowany z wahaniem. ;) – Mehrdad

Odpowiedz

18

BitSet

Klasa ta realizuje wektor bitów, które rośnie w miarę potrzeby. Każda składowa zestawu bitów ma wartość boolowską. Bity zestawu bitów są indeksowane przez nieujemne liczby całkowite. Indywidualne bity indeksowane mogą być zbadane, ustawione lub wyczyszczone. Jeden bitSet może być użyty do modyfikacji zawartości innego zestawu bitów poprzez logiczne AND, logiczne włącznie, i logiczne wyłączne operacje OR.

Link to benchmark między używaniem boolean kontra BitSet

+0

Dziękuję. Ale proszę odpowiedz na pytanie, które właśnie dodałem w EDYCJI. –

1

Można użyć EnumSet również. Pozwala to na używanie nazwanych bitów i może być bardziej przyjazne niż przy użyciu BitSet, który używa indeksowanych bitów.

Specjalistyczna implementacja zestawu do użytku z typami wyliczeniowymi. Wszystkie elementy w zestawie enum muszą pochodzić z pojedynczego typu wyliczeniowego, który jest określony, jawnie lub niejawnie, podczas tworzenia zestawu. Zestawy enum są reprezentowane wewnętrznie jako wektory bitowe. Ta reprezentacja jest niezwykle kompaktowa i wydajna. Wydajność w czasie i przestrzeni tej klasy powinna być wystarczająco dobra, aby umożliwić jej użycie jako wysokiej jakości, bezpiecznej dla zdrowia alternatywy dla tradycyjnych "bitowych flag" opartych na int. Nawet operacje masowe (takie jak containsAll i retainAll) powinny działać bardzo szybko, jeśli ich argument jest również zbiorem enum.

np.

BitSet bs = new BitSet(4); 
bs.set(1); // READY 
bs.set(3); // LARGE_FLAG 
boolean largeFlag = bs.get(1); // LARGE_FLAG 
System.out.println("Using BitSet: "+bs); 

EnumSet<Settings> settings = EnumSet.noneOf(Settings.class); 
settings.add(Settings.READY); 
settings.add(Settings.LARGE_FLAG); 
boolean largeFlag2 = settings.contains(Settings.LARGE_FLAG); 
System.out.println("Using EnumSet: "+settings); 

drukuje

Using BitSet: {1, 3} 
Using EnumSet: [READY, LARGE_FLAG] 

IMHO EnumSet jest znacznie wyraźniejszy, jeśli jego właściwe.