Можно ли объявить 1-битную переменную в Java? - PullRequest
6 голосов
/ 13 января 2012

В моем алгоритме используется огромный массив boolean, и, как меня учили, для каждой логической переменной требуется 1 байт. Есть ли в любом случае, чтобы объявить логический массив и уменьшить использование памяти, потому что я работаю в телефонной среде.

РЕДАКТИРОВАТЬ: мой друг и я обсуждаем, если BitSet медленнее, чем обычный логический массив. Пожалуйста, уточните это. Алгоритм все еще нуждается в производительности как наилучший спрос.

Ответы [ 2 ]

18 голосов
/ 13 января 2012

BitSet

Этот класс реализует вектор битов, который увеличивается по мере необходимости. каждый Компонент набора битов имеет логическое значение. Биты BitSet являются индексируется неотрицательными целыми числами. Отдельные индексированные биты могут быть осмотрен, установлен или очищен. Один BitSet может быть использован для изменения содержимое другого BitSet через логическое И, включающее логическое ИЛИ, и логические операции исключающего ИЛИ.

Ссылка на эталонный тест между использованием boolean против BitSet

1 голос
/ 13 января 2012

Вы также можете использовать EnumSet .Это позволяет использовать именованные биты и может быть более удобным, чем использование BitSet, в котором используются индексированные биты.

Специализированная реализация Set для использования с типами enum.Все элементы в наборе перечислений должны происходить из одного типа перечисления, который указывается, явно или неявно, при создании набора.Наборы перечислений представляются внутри как битовые векторы.Это представление чрезвычайно компактно и эффективно.Пространственно-временные характеристики этого класса должны быть достаточно хорошими, чтобы его можно было использовать в качестве высококачественной, безопасной для типов альтернативы традиционным основанным на int «битовым флагам».Даже массовые операции (такие как containsAll и retainAll) должны выполняться очень быстро, если их аргумент также является набором перечислений.

например

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);

печать

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

ИМХО EnumSet намного понятнее, если это уместно.

...