`

Java的BitSet类(JDK1.1)

    博客分类:
  • Java
阅读更多

BitSet实际是由“二进制位”构成的一个Vector。如果希望高效率地保存大量“开-关”信息,就应使用BitSet。它只有从尺寸的角度看才有意义;如果希望的高效率的访问,那么它的速度会比使用一些固有类型的数组慢一些。此外,BitSet的最小长度是一个长整数(Long)的长度:64位。

 

(1)BitSet
   
大小可动态改变, 取值为truefalse的位集合。用于表示一组布尔标志。   

此类实现了一个按需增长的位向量。位 set 的每个组件都有一个 boolean 值。用非负的整数将 BitSet 的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。通过逻辑与、逻辑或和逻辑异或操作,可以使用一个 BitSet 修改另一个 BitSet 的内容。

默认情况下,set 中所有位的初始值都是 false

  每个位 set 都有一个当前大小,也就是该位 set 当前所用空间的位数。注意,这个大小与位 set 的实现有关,所以它可能随实现的不同而更改。位 set 的长度与位 set 的逻辑长度有关,并且是与实现无关而定义的。

   除非另行说明,否则将 null 参数传递给 BitSet 中的任何方法都将导致 NullPointerException 在没有外部同步的情况下,多个线程操作一个 BitSet 是不安全的。

 

(2) 构造函数:

BitSet() or BitSet(int nbits)

 

(3) 一些方法
public void set(int pos):
位置pos的字位设置为true
public void set(int bitIndex, boolean value)
将指定索引处的位设置为指定的值。
public void clear(int pos):
位置pos的字位设置为false
public void clear() :
将此 BitSet 中的所有位设置为 false
public int cardinality()
返回此 BitSet 中设置为 true 的位数。
public boolean get(int pos):
返回位置是pos的字位值。
public void and(BitSet other): other
同该字位集进行与操作,结果作为该字位集的新值。
public void or(BitSet other): other
同该字位集进行或操作,结果作为该字位集的新值。
public void xor(BitSet other): other
同该字位集进行异或操作,结果作为该字位集的新值。
public void andNot(BitSet set)
清除此 BitSet 中所有的位,set - 用来屏蔽此 BitSet BitSet
public int size():
返回此 BitSet 表示位值时实际使用空间的位数。
public int length()
返回此 BitSet 逻辑大小BitSet 中最高设置位的索引加 1
public int hashCode():
返回该集合Hash 码, 这个码同集合中的字位值有关。
public boolean equals(Object other):
如果other中的字位同集合中的字位相同,返回true
public Object clone()
克隆此 BitSet,生成一个与之相等的新 BitSet
public String toString()
返回此位 set 的字符串表示形式。

 

(4)例子

例1:标明一个字符串中用了哪些字符
import java.util.BitSet;
public class WhichChars{
   private BitSet used = new BitSet();
   public WhichChars(String str){
      for(int i=0;i< str.length();i++)
        used.set(str.charAt(i));  // set bit for char
   }
    public String toString(){
         String desc="[";
         int size=used.size();
          for(int i=0;i< size;i++){
             if(used.get(i))
                 desc+=(char)i;
            }
             return desc+"]";
         }
    public static void main(String args[]){
        WhichChars w=new WhichChars("How do you do");
        System.out.println(w);
    }
   }
运行:
C:\work>java WhichChars
[ Hdouwy]

 

 

例2:筛选法求素数
import java.util.*;
public class BitSetTest{
   public static void main(String[] args){
      BitSet sieve=new BitSet(1024);
      int size=sieve.size();
      for(int i=2;i< size;i++)
           sieve.set(i);
      int finalBit=(int)Math.sqrt(sieve.size());
      
      for(int i=2;i< finalBit;i++)
         if(sieve.get(i))
           for(int j=2*i;j< size;j+=i)
               sieve.clear(j);
      
      int counter=0;
      for(int i=1;i< size;i++){
          if(sieve.get(i)){
             System.out.printf("%5d",i);
             if(++counter%15==0)
                System.out.println();
          }
       }
    }
}
C:\work>java   BitSetTest
    2    3    5    7   11   13   17   19   23   29   31   37   41   43   47
   53   59   61   67   71   73   79   83   89   97  101  103  107  109  113
  127  131  137  139  149  151  157  163  167  173  179  181  191  193  197
  199  211  223  227  229  233  239  241  251  257  263  269  271  277  281
  283  293  307  311  313  317  331  337  347  349  353  359  367  373  379
  383  389  397  401  409  419  421  431  433  439  443  449  457  461  463
  467  479  487  491  499  503  509  521  523  541  547  557  563  569  571
  577  587  593  599  601  607  613  617  619  631  641  643  647  653  659
  661  673  677  683  691  701  709  719  727  733  739  743  751  757  761
  769  773  787  797  809  811  821  823  827  829  839  853  857  859  863
  877  881  883  887  907  911  919  929  937  941  947  953  967  971  977
  983  991  997 1009 1013 1019 1021

 

 

例3:简单使用1
import java.util.BitSet;
public class BitOHoney {
  public static void main(String args[]) {
    String names[] = { "Java", "Source", "and", "Support"};
    BitSet bits = new BitSet();
    for (int i = 0, n = names.length; i < n; i++) {
      if ((names[i].length() % 2) == 0) {
        bits.set(i);
      }
    }
    System.out.println(bits);
    System.out.println("Size : " + bits.size());
    System.out.println("Length: " + bits.length());
    for (int i = 0, n = names.length; i < n; i++) {
      if (!bits.get(i)) {
        System.out.println(names[i] + " is odd");
      }
    }
    BitSet bites = new BitSet();
    bites.set(0);
    bites.set(1);
    bites.set(2);
    bites.set(3);
    bites.andNot(bits);
    System.out.println(bites);
  }
}
运行:
C:\work>java BitOHoney
{0, 1}
Size : 64
Length: 2
and is odd
Support is odd
{2, 3}

 

 

例4:简单使用2
import java.util.*;
public class HolidaySked{
    BitSet sked;

    public HolidaySked(){
        sked = new BitSet(365);
        int[] holiday = {1,15,50,148,185,246,281,316,326,359};
        for(int i = 0;i<holiday.length;i++){
            addHoliday(holiday[i]);
        }
    }

    public void addHoliday(int dayToAdd){
        sked.set(dayToAdd);
    }
    public boolean isHoliday(int dayToCheck){
        boolean result = sked.get(dayToCheck);
        return result;
    }
   
    public static void main(String[] arguments){
        HolidaySked cal = new HolidaySked();
        if(arguments.length>0){
            try{
                int whichDay = Integer.parseInt(arguments[0]);
                if(cal.isHoliday(whichDay)){
                    System.out.println("Day number "+ whichDay + " is a holiday.");
                }else{
                    System.out.println("Day number "+ whichDay + " is not a holiday.");
                }
            }catch(NumberFormatException nfe){
                System.out.println("Error: " + nfe.getMessage());
            }
        }
    }
}
上例通过sked.set(dayToAdd) 来设置相应位置为1。再通过sked.get(dayToCheck)来读取相应值。这样,就很方便的完成了一系列位的置1。

 

分享到:
评论

相关推荐

    java实用工具类

    虽然`Date`类在早期版本的Java中存在很多过时的方法,但在JDK 1.1之后引入了`Calendar`类来改善日期和时间的处理。 - `Calendar`类:是一个抽象类,提供了更灵活的日期和时间操作。它支持不同日历系统(如公历、...

    java 编程入门思考

    13.16.3 用Java 1.1 AWT制作窗口和程序片 13.16.4 再探早期示例 13.16.5 动态绑定事件 13.16.6 将商业逻辑与UI逻辑区分开 13.16.7 推荐编码方法 13.17 Java 1.1 UI API 13.17.1 桌面颜色 13.17.2 打印 13.17.3 剪贴...

    Java初学者入门教学

    13.16.3 用Java 1.1 AWT制作窗口和程序片 13.16.4 再探早期示例 13.16.5 动态绑定事件 13.16.6 将商业逻辑与UI逻辑区分开 13.16.7 推荐编码方法 13.17 Java 1.1 UI API 13.17.1 桌面颜色 13.17.2 打印 13.17.3 剪贴...

    java联想(中文)

    13.16.3 用Java 1.1 AWT制作窗口和程序片 13.16.4 再探早期示例 13.16.5 动态绑定事件 13.16.6 将商业逻辑与UI逻辑区分开 13.16.7 推荐编码方法 13.17 Java 1.1 UI API 13.17.1 桌面颜色 13.17.2 打印 13.17.3 剪贴...

    JAVA_Thinking in Java

    13.16.3 用Java 1.1 AWT制作窗口和程序片 13.16.4 再探早期示例 13.16.5 动态绑定事件 13.16.6 将商业逻辑与UI逻辑区分开 13.16.7 推荐编码方法 13.17 Java 1.1 UI API 13.17.1 桌面颜色 13.17.2 打印 13.17.3 剪贴...

    Thinking in Java简体中文(全)

    13.16.3 用Java 1.1 AWT制作窗口和程序片 13.16.4 再探早期示例 13.16.5 动态绑定事件 13.16.6 将商业逻辑与UI逻辑区分开 13.16.7 推荐编码方法 13.17 Java 1.1 UI API 13.17.1 桌面颜色 13.17.2 打印 13.17.3 剪贴...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    13.16.3 用Java 1.1 AWT制作窗口和程序片 13.16.4 再探早期示例 13.16.5 动态绑定事件 13.16.6 将商业逻辑与UI逻辑区分开 13.16.7 推荐编码方法 13.17 Java 1.1 UI API 13.17.1 桌面颜色 13.17.2 打印 13.17.3 剪贴...

    Think in Java(中文版)chm格式

    13.16.3 用Java 1.1 AWT制作窗口和程序片 13.16.4 再探早期示例 13.16.5 动态绑定事件 13.16.6 将商业逻辑与UI逻辑区分开 13.16.7 推荐编码方法 13.17 Java 1.1 UI API 13.17.1 桌面颜色 13.17.2 打印 13.17...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    13.16.3 用Java 1.1 AWT制作窗口和程序片 13.16.4 再探早期示例 13.16.5 动态绑定事件 13.16.6 将商业逻辑与UI逻辑区分开 13.16.7 推荐编码方法 13.17 Java 1.1 UI API 13.17.1 桌面颜色 13.17.2 打印 13.17.3 剪贴...

    thinking in java

    - **环境搭建**:介绍了如何设置开发环境,包括安装Java开发工具包(JDK)。 - **第一个Java程序**:通过一个简单的“Hello World”程序来演示Java程序的基本结构和语法。 #### 1.2 Java学习目标 - 明确了学习Java...

    ThinkInJava

    13.16.3 用Java 1.1 AWT制作窗口和程序片 13.16.4 再探早期示例 13.16.5 动态绑定事件 13.16.6 将商业逻辑与UI逻辑区分开 13.16.7 推荐编码方法 13.17 Java 1.1 UI API 13.17.1 桌面颜色 13.17.2 打印 13.17.3 剪贴...

    thinkinjava

    13.16.3 用Java 1.1 AWT制作窗口和程序片 13.16.4 再探早期示例 13.16.5 动态绑定事件 13.16.6 将商业逻辑与UI逻辑区分开 13.16.7 推荐编码方法 13.17 Java 1.1 UI API 13.17.1 桌面颜色 13.17.2 打印 13.17.3 剪贴...

Global site tag (gtag.js) - Google Analytics