Я хотел бы знать то, что является использованием памяти BitSet в Scala. Например, если я делаю:
var bitArray:BitSet=new BitSet(10)
bitArray.add(0)
bitArray.add(2)
bitArray.add(4)
bitArray.add(6)
bitArray.add(8)
Как это соответствует и массив, содержащий четные числа 0,2,4,6,8?
Что относительно того, чтобы писать число в двоичном файле:
var bitArray:BitSet=new BitSet(32)
bitArray.add(5)
bitArray.add(3)
bitArray.add(2)
bitArray.add(1)
bitArray.add(0)
Как это выдерживает сравнение с номером 47?
Я спрашиваю здесь использования памяти. Но как больше нерешенного вопроса, если Вы знаете, что является преимуществами/недостатками или использованием BitSet (WR к другим типам общих данных).
Спасибо,
Вы можете посмотреть реализацию BitSet в Scala 2.8 здесь: scala.collection.mutable.BitSet .
Реализован на основе массива Long. Размер массива зависит только от самого большого числа, хранящегося в нем. Разделите самое большое число, хранящееся в нем, на 64, округляя в большую сторону, и вы получите размер массива. Каждый элемент в массиве занимает 8 байтов.
Это означает, что деление на 8 наибольшего числа, хранящегося в нем, примерно дает размер BitSet в байтах. «Примерно» из-за накладных расходов на управление памятью виртуальной машины, потому что указателю на массив также требуется некоторая память и потому что сам массив имеет некоторые накладные расходы.
Порядок вставки или фактическое количество элементов, хранящихся в BitSet, не влияет на размер выделенной памяти.
В двух приведенных вами примерах для хранения чисел требуется только один Long-элемент с использованием 8 байтов памяти, так как в обоих примерах максимальное число меньше 64.
Массив Ints, хранящий любые числа. пять чисел потребуют 5 * 4 байта = 20 байтов плюс служебные данные. Для хранения n чисел вам понадобится примерно n * 4 байта.
Таким образом, вы сравниваете (highNumberStored / 8) байтов с (countOfNumbersStored * 4) байтами.