2015-12-08 12 views
0

Позвольте быть bs1 a BitSet в Java.
Первый бит установлен bs1.set(0), то его size и length - 64 и 1 соответственно.
65-й бит установлен bs1.set(64), тогда его size и length - 128 и 65 соответственно.Каков размер Java BitSet после роста, сжатия и клонирования его значения?

Теперь, если я очищу свой 65-й бит bs1.clear(64), его length вернитесь к 1, но что произойдет с его размером? Что произойдет, если я буду клонировать битет? это новый размер по умолчанию?

ответ

0

Меньше слов и больше кода, здесь эксперимент, на мой взгляд, отвечает на вопрос:

import java.util.BitSet; 

public class BitSetExperiment { 
    public static void main(String[] args) { 
     BitSet bs0=new BitSet(); 
     BitSet bs1; 
     System.out.println("created:\tLength,Size bs0: "+bs0.length()+" , "+bs0.size()); 
     bs0.set(15); 
     System.out.println("set(15):\tLength,Size bs0: "+bs0.length()+" , "+bs0.size()); 
     bs0.set(63); 
     System.out.println("set(63):\tLength,Size bs0: "+bs0.length()+" , "+bs0.size()); 
     bs0.set(86); 
     System.out.println("set(86):\tLength,Size bs0: "+bs0.length()+" , "+bs0.size()); 
     bs0.clear(86); 
     System.out.println("clear(86):\tLength,Size bs0: "+bs0.length()+" , "+bs0.size()); 
     bs0.clear(63); 
     System.out.println("clear(63):\tLength,Size bs0: "+bs0.length()+" , "+bs0.size()); 

     System.out.println("Cloning to bs1...\n"); 
     bs1=(BitSet)bs0.clone(); 
     System.out.println("Length,Size bs0: "+bs0.length()+" , "+bs0.size()); 
     System.out.println("Length,Size bs1: "+bs1.length()+" , "+bs1.size()); 
    } 
} 

Выход:

created: Length,Size bs0: 0 , 64 
set(15): Length,Size bs0: 16 , 64 
set(63): Length,Size bs0: 64 , 64 
set(86): Length,Size bs0: 87 , 128 
clear(86): Length,Size bs0: 64 , 128 
clear(63): Length,Size bs0: 16 , 128 
Cloning to bs1... 

Length,Size bs0: 16 , 64 
Length,Size bs1: 16 , 64 

Глядя на выходе, я обнаружил две вещи:

  1. Когда вы очищаете более значимые биты, битсет не урезает его размер, но, возможно, это делается с использованием других механизмов, более сложных как @Boris Spider предлагает в своем комментарии.
  2. При клонировании BitSet, оригинал, а также клон представлены в минимально возможном распределении (в факторах 64 бит)
+0

Если 'BitSet' подстриженной его размер, когда вы нолик на границе , вы бы выросли производительность. Если «BitSet» должен был автоматически обрезать свой размер, это, скорее всего, произойдет в соответствии с [лучшей практикой] (https://ece.uwaterloo.ca/~dwharder/aads/Algorithms/Array_resizing/) - что немного сложнее чем показывают ваши тесты. –

+0

Полностью согласен, очень вероятно, что Java фактически обрезает биты, но не сразу после очистки пространства. Я поставлю эту возможность в ответ – onlycparra