Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2794930
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: Java

2012-03-10 11:24:43

 BitSet大小可动态改变, 取值为true或false的位集合,用于表示一组布尔标志。
->此类实现了一个按需增长的位向量。位 set 的每个组件(index,value)都有一个 boolean 值。
->用非负的整数将 BitSet 的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。
->通过逻辑与、逻辑或和逻辑异或操作,可以使用一个 BitSet 修改另一个 BitSet 的内容。
->默认情况下,set 中所有位的初始值都是 false。  
->
除非另行说明,否则将 null 参数传递给 BitSet 中的任何方法都将导致 NullPointerException。 在没有外部同步的情况下,多个线程操作一个 BitSet 是不安全的。 

BitSet实际是由“二进制位”构成的一个Vector。如果希望高效率地保存大量“开-关”信息,就应使用BitSet。
BitSet的最小长度是一个长整数(Long)的长度:64位。这意味着假如我们准备保存比这更小的数据,如8位数据,那么BitSet就显得浪费了 

(1) 构造函数: BitSet() or BitSet(int nbits)

new一个BitSet(950)并不等于建立一个950大小的bs ,只是说构建出来的bs初始大小至少能容纳950个bit,大小永远是系统控制的。而且他的大小是64的倍数,就算BitSet(1),他的大小也是64。
  1. public static void main(String args[]) {
  2.        
  3.         BitSet bs=new BitSet(950);
  4.         bs.set(0);
  5.         bs.set(1);
            bs.get(0);
  6.         System.out.println("返回以最高位为true做结束的长度: "+bs.length());
  7.         System.out.println("bs.size: "+bs.size());
  8.     }

     输出:
     true
  9. 返回以最高位为true做结束的长度: 2
  10. bs.size: 960 64的倍数
   (2) 一些方法 

  1. // 位与
  2. void and(BitSet set)
  3. // 参数set先取反,再与
  4. void andNot(BitSet set)
  5. // 位或
  6. void or(BitSet set)
  7. // 异或
  8. void xor(BitSet set)
  9. // 该位取反
  10. void flip(int bitIndex)
  11. // 一片区取反,前闭后开
  12. void flip(int fromIndex, int toIndex)
  13.   
  14. // 如果有一个位两者都为true,返回true
  15. boolean intersects(BitSet set)
  16.   
  17. // 设置该位为true
  18. void set(int bitIndex)
  19. void set(int bitIndex, boolean value)
  20. // 设置一片区为true,前闭后开
  21. void set(int fromIndex, int toIndex)
  22. void set(int fromIndex, int toIndex, boolean value)
  23.   
  24. // 返回指定位置的值
  25. boolean get(int bitIndex)
  26. // 返回一个BitSet子集,前闭后开
  27. BitSet get(int fromIndex, int toIndex)
  28.   
  29. // 设置所有位为false
  30. void clear()
  31.   
  32. // 返回从指定位置开始的第一个为true的位置,否则返回 -1
  33. int nextSetBit(int fromIndex)
  34. // 返回从指定位置开始的第一个为false的位置
  35. int nextClearBit(int fromIndex)
  36.   
  37. // 返回位为true的个数
  38. int cardinality()
  39.   
  40. // 返回以最高位为true做结束的长度
  41. int length()
  42.   
  43. // 如果没有一位为true,返回true
  44. boolean isEmpty()
例子: 标明一个字符串中用了哪些字符

  1. package itcast.bloofilter;

  2. import java.util.BitSet;

  3. public class TestBitSet {

  4.     private BitSet used = new BitSet();

  5.     public TestBitSet(String str) {
  6.         for (int i = 0; i < str.length(); i++)
  7.         {
  8.             used.set(str.charAt(i)); // set bit for char
  9.         }
  10.     }

  11.     public String toString() {
  12.         String desc = "[";
  13.         int size = used.size();
  14.         //构造方法把字符的ascii编码作为index,把BitSet置为true,把它取出来逆向转回字符
  15.         for (int i = 0; i < size; i++) {
  16.             if (used.get(i))
  17.                 desc += (char) i;
  18.         }
  19.         return desc + "]";
  20.     }

  21.     public static void main(String args[]) {
  22.         TestBitSet w = new TestBitSet("How do you do");
  23.         System.out.println(w);
  24.         
  25.     }

  26. }

  27. 输出:[ Hdouwy]
阅读(546) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~