`

java中的BitSet学习

 
阅读更多

转:http://blog.csdn.net/feihong247/article/details/7849317

 

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

此类实现了一个按需增长的位向量。位 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 的字符串表示形式。

例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. java.util.BitSet 研究(存数海量数据时的一个途径)

 

java.util.BitSet可以按位存储。
计算机中一个字节(byte)占8位(bit),我们java中数据至少按字节存储的,
比如一个int占4个字节。
如果遇到大的数据量,这样必然会需要很大存储空间和内存。
如何减少数据占用存储空间和内存可以用算法解决。
java.util.BitSet就提供了这样的算法。
比如有一堆数字,需要存储,source=[3,5,6,9]
用int就需要4*4个字节。
java.util.BitSet可以存true/false。
如果用java.util.BitSet,则会少很多,其原理是:
1,先找出数据中最大值maxvalue=9
2,声明一个BitSet bs,它的size是maxvalue+1=10
3,遍历数据source,bs[source[i]]设置成true.

最后的值是:
(0为false;1为true)
bs [0,0,0,1,0,1,1,0,0,1]
                3,   5,6,       9

这样一个本来要int型需要占4字节共32位的数字现在只用了1位!
比例32:1  

这样就省下了很大空间。

 

 

看看测试例子

[html] view plaincopy
 
 
  1. package com;  
  2.   
  3. import java.util.BitSet;  
  4.   
  5. public class MainTestThree {  
  6.   
  7.     /**  
  8.      * @param args  
  9.      */  
  10.     public static void main(String[] args) {  
  11.         BitSet bm=new BitSet();  
  12.         System.out.println(bm.isEmpty()+"--"+bm.size());  
  13.         bm.set(0);  
  14.         System.out.println(bm.isEmpty()+"--"+bm.size());  
  15.         bm.set(1);  
  16.         System.out.println(bm.isEmpty()+"--"+bm.size());  
  17.         System.out.println(bm.get(65));  
  18.         System.out.println(bm.isEmpty()+"--"+bm.size());  
  19.         bm.set(65);  
  20.         System.out.println(bm.isEmpty()+"--"+bm.size());  
  21.     }  
  22.   
  23. }  

 输出:
 true--64
false--64
false--64
false
false--64
false--128
 
说明默认的构造函数声明一个64位的BitSet,值都是false。
如果你要用的位超过了默认size,它会再申请64位,而不是报错。

[html] view plaincopy
 
 
  1. package com;  
  2.   
  3. import java.util.BitSet;  
  4.   
  5. public class MianTestFour {  
  6.   
  7.     /**  
  8.      * @param args  
  9.      */  
  10.     public static void main(String[] args) {  
  11.         BitSet bm1=new BitSet(7);  
  12.         System.out.println(bm1.isEmpty()+"--"+bm1.size());  
  13.           
  14.         BitSet bm2=new BitSet(63);  
  15.         System.out.println(bm2.isEmpty()+"--"+bm2.size());  
  16.           
  17.         BitSet bm3=new BitSet(65);  
  18.         System.out.println(bm3.isEmpty()+"--"+bm3.size());  
  19.           
  20.         BitSet bm4=new BitSet(111);  
  21.         System.out.println(bm4.isEmpty()+"--"+bm4.size());  
  22.     }  
  23.   
  24. }  


 

输出:
true--64
true--64
true--128
true--128

说明你申请的位都是以64为倍数的,就是说你申请不超过一个64的就按64算,超过一个不超过
2个的就按128算。

 

[html] view plaincopy
 
 
  1. package com;  
  2.   
  3. import java.util.BitSet;  
  4.   
  5. public class MainTestFive {  
  6.   
  7.     /**  
  8.      * @param args  
  9.      */  
  10.     public static void main(String[] args) {  
  11.         int[] shu={2,42,5,6,6,18,33,15,25,31,28,37};  
  12.         BitSet bm1=new BitSet(MainTestFive.getMaxValue(shu));  
  13.         System.out.println("bm1.size()--"+bm1.size());  
  14.           
  15.         MainTestFive.putValueIntoBitSet(shu, bm1);  
  16.         printBitSet(bm1);  
  17.     }  
  18.       
  19.     //初始全部为false,这个你可以不用,因为默认都是false  
  20.     public static void initBitSet(BitSet bs){  
  21.         for(int i=0;i<bs.size();i++){  
  22.             bs.set(i, false);  
  23.         }  
  24.     }  
  25.     //打印  
  26.     public static void printBitSet(BitSet bs){  
  27.         StringBuffer buf=new StringBuffer();  
  28.         buf.append("[\n");  
  29.         for(int i=0;i<bs.size();i++){  
  30.             if(i<bs.size()-1){  
  31.                 buf.append(MainTestFive.getBitTo10(bs.get(i))+",");  
  32.             }else{  
  33.                 buf.append(MainTestFive.getBitTo10(bs.get(i)));  
  34.             }  
  35.             if((i+1)%8==0&&i!=0){  
  36.                 buf.append("\n");  
  37.             }  
  38.         }  
  39.         buf.append("]");  
  40.         System.out.println(buf.toString());  
  41.     }  
  42.     //找出数据集合最大值  
  43.     public static int getMaxValue(int[] zu){  
  44.         int temp=0;  
  45.         temp=zu[0];  
  46.         for(int i=0;i<zu.length;i++){  
  47.             if(temp<zu[i]){  
  48.                 temp=zu[i];  
  49.             }  
  50.         }  
  51.         System.out.println("maxvalue:"+temp);  
  52.         return temp;  
  53.     }  
  54.     //放值  
  55.     public static void putValueIntoBitSet(int[] shu,BitSet bs){  
  56.         for(int i=0;i<shu.length;i++){  
  57.             bs.set(shu[i], true);  
  58.         }  
  59.     }  
  60.     //true,false换成1,0为了好看  
  61.     public static String getBitTo10(boolean flag){  
  62.         String a="";  
  63.         if(flag==true){  
  64.             return "1";  
  65.         }else{  
  66.             return "0";  
  67.         }  
  68.     }  
  69.   
  70. }  


 


输出:
maxvalue:42
bm1.size()--64
[
0,0,1,0,0,1,1,0,
0,0,0,0,0,0,0,1,
0,0,1,0,0,0,0,0,
0,1,0,0,1,0,0,1,
0,1,0,0,0,1,0,0,
0,0,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0
]

这样便完成了存值和取值。
注意它会对重复的数字过滤,就是说,一个数字出现过超过2次的它都记成1.

出现的次数这个信息就丢了

分享到:
评论

相关推荐

    javabitset源码-Java8-learning:学习Java8新特性

    在Java8之前,接口中只能包含抽象方法。那么这有什么样弊端呢?比如,想再Collection接口中添加一个spliterator抽象方法,那么也就意味着之前所有实现Collection接口的实现类,都要重新实现spliterator这个方法才行...

    javabitset源码-Study:学习

    Java中的锁和同步类 公平锁 & 非公平锁 悲观锁 乐观锁 & CAS ABA 问题 CopyOnWrite容器 RingBuffer 可重入锁 & 不可重入锁 互斥锁 & 共享锁 死锁 操作系统 计算机原理 CPU 多级缓存 进程 线程 协程 Linux 设计模式 ...

    JAVA SE学习精华集锦

    1.5 J2SE学习中的30个基本概念 58 1.6 Java线程 60 1.7 Java 5.0多线程编程 65 1.8 Java Socket编程 80 1.9 Java的内存泄漏 85 1.10 抽象类与接口的区别 86 1.11 Java变量类型间的相互转换 87 2 JAVA与WEB 87 2.1 ...

    (超赞)JAVA精华之--深入JAVA API

    1.5 J2SE学习中的30个基本概念 1.6 Java线程 1.7 Java 5.0多线程编程 1.8 Java Socket编程 1.9 Java的内存泄漏 1.10 抽象类与接口的区别 1.11 Java变量类型间的相互转换 2 JAVA与WEB 2.1 JMX规范 2.1.1 JMX概述 ...

    javabitset源码-awesome-go-cn:AwesomeGo项目的中文翻译

    java bitset源码 Awesome Go 中文翻译 awesome Go项目的中文翻译,原文请点击 . 贡献 首先请看一下这个 。同时感谢这些 。 you rock! 如果你看到下面的某个项目已经不再被支持或者并不适用,请提交一个pull request...

    Thinking in Java简体中文(全)

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    javabitset源码-developer-knowledge-map:后端开发人员知识图谱

    bitset 源码 后端开发者知识图谱 大体了解,按需精通 语言 PHP Laravel JAVA Go JavaScript(TypeScript) Python 服务器脚本、科学计算、机器学习 C、C++ 其他语言 Ruby、LUA、Swift、OC、Kotlin、Rust、Scala、R ...

    java联想(中文)

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    javabitset源码-read-jdk8:阅读JDK8源码,写一些解释

    bitset源码 Learn JDK 8 学习 JDK 8 源码设计。 阅读前的准备 下载 jdk1.8.0_211,将其中的 src.zip 文件解压。解压后目录如下(部分已省略): └─src └─java ├─io ├─lang ├─math ├─net ├─nio ├─...

    java 编程入门思考

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    Java初学者入门教学

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    JAVA_Thinking in Java

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    Java21Days_Exercises:学习Java的练习

    Java21Days_Exercises 学习了《 21天的Java》一书中学习Java的练习。 类,它们的实例和方法。 覆盖,使用“ this”和“ super”。 包,接口,访问修饰符。 异常(尝试,捕获,引发,抛出)和线程。 数据结构(BitSet...

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

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    Think in Java(中文版)chm格式

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 ...

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

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    ThinkInJava

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    thinkinjava

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

Global site tag (gtag.js) - Google Analytics