(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
package com;
import java.util.BitSet;
public class MainTestThree {
/**
* @param args
*/
public static void main(String[] args) {
BitSet bm=new BitSet();
System.out.println(bm.isEmpty()+"--"+bm.size());
bm.set(0);
System.out.println(bm.isEmpty()+"--"+bm.size());
bm.set(1);
System.out.println(bm.isEmpty()+"--"+bm.size());
System.out.println(bm.get(65));
System.out.println(bm.isEmpty()+"--"+bm.size());
bm.set(65);
System.out.println(bm.isEmpty()+"--"+bm.size());
}
}
输出:
true--64
false--64
false--64
false
false--64
false--128
说明默认的构造函数声明一个64位的BitSet,值都是false。
如果你要用的位超过了默认size,它会再申请64位,而不是报错。
[html] view plaincopy
package com;
import java.util.BitSet;
public class MianTestFour {
/**
* @param args
*/
public static void main(String[] args) {
BitSet bm1=new BitSet(7);
System.out.println(bm1.isEmpty()+"--"+bm1.size());
BitSet bm2=new BitSet(63);
System.out.println(bm2.isEmpty()+"--"+bm2.size());
BitSet bm3=new BitSet(65);
System.out.println(bm3.isEmpty()+"--"+bm3.size());
BitSet bm4=new BitSet(111);
System.out.println(bm4.isEmpty()+"--"+bm4.size());
}
}
输出:
true--64
true--64
true--128
true--128
说明你申请的位都是以64为倍数的,就是说你申请不超过一个64的就按64算,超过一个不超过
2个的就按128算。
[html] view plaincopy
package com;
import java.util.BitSet;
public class MainTestFive {
/**
* @param args
*/
public static void main(String[] args) {
int[] shu={2,42,5,6,6,18,33,15,25,31,28,37};
BitSet bm1=new BitSet(MainTestFive.getMaxValue(shu));
System.out.println("bm1.size()--"+bm1.size());
MainTestFive.putValueIntoBitSet(shu, bm1);
printBitSet(bm1);
}
//初始全部为false,这个你可以不用,因为默认都是false
public static void initBitSet(BitSet bs){
for(int i=0;i<bs.size();i++){
bs.set(i, false);
}
}
//打印
public static void printBitSet(BitSet bs){
StringBuffer buf=new StringBuffer();
buf.append("[\n");
for(int i=0;i<bs.size();i++){
if(i<bs.size()-1){
buf.append(MainTestFive.getBitTo10(bs.get(i))+",");
}else{
buf.append(MainTestFive.getBitTo10(bs.get(i)));
}
if((i+1)%8==0&&i!=0){
buf.append("\n");
}
}
buf.append("]");
System.out.println(buf.toString());
}
//找出数据集合最大值
public static int getMaxValue(int[] zu){
int temp=0;
temp=zu[0];
for(int i=0;i<zu.length;i++){
if(temp<zu[i]){
temp=zu[i];
}
}
System.out.println("maxvalue:"+temp);
return temp;
}
//放值
public static void putValueIntoBitSet(int[] shu,BitSet bs){
for(int i=0;i<shu.length;i++){
bs.set(shu[i], true);
}
}
//true,false换成1,0为了好看
public static String getBitTo10(boolean flag){
String a="";
if(flag==true){
return "1";
}else{
return "0";
}
}
}
输出:
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.
出现的次数这个信息就丢了
分享到:
相关推荐
Java的BitSet是一个实用工具类,它提供了位操作的功能,常用于存储一组可变的布尔值。在多线程并发环境中,对BitSet的操作需要特别注意,因为位操作本身是原子性的,但BitSet的大部分方法并不是线程安全的。这篇博文...
Java中BitSet类是Java集合框架的一部分,它是一种用于处理位操作的高级数据结构。BitSet可以看作是一个只存储布尔值的数组,但相比于原始的布尔数组,BitSet更加内存高效,因为它以64位的块(word)来存储多个布尔值...
Java BitSet 使用场景和代码示例 Java BitSet 是 Java 中的一个重要类,它实现了一个按需增长的位向量。BitSet 的每一个组件都有一个 boolean 值,用非负的整数将 BitSet 的位编入索引。可以对每个编入索引的位进行...
java bitset 高级数据结构 源码解析 适合 0-3 年开发人员,进阶、面试必备知识!
java基础之BitSet - 副本
bitset 源码 对于Java开发者来说,Java8的版本显然是一个具有里程碑意义的版本,蕴含了许多令人激动的新特性,如果能利用好这些新特性,能够大大提升我们的开发效率。Java8的函数式编程能够大大减少代码量和便于维护...
基于JDK1.8的BitSet 源码分析, 描述了实现的原理 个方法的含义 虽然没有写出实际的测试代码 但是只要是细度了我的这个分析 在使用的时候就不是问题了
bitset源码Java源码分析 基础集合列表 ArrayList (done) Vector (done) LinkedList (done) Stack (done) ReferenceQueue (done) ArrayDeque (done) Set HashSet (done) TreeSet (done) LinkedHashSet (done) BitSet ...
java bitset 源码 最后更新于20180424 (Toc generated by ) 数据结构 队列 非阻塞队列:ConcurrentLinkedQueue(无界线程安全),采用CAS机制(compareAndSwapObject原子操作)。 阻塞队列:ArrayBlockingQueue(有界...
bitset源码Java 这是 Java Bitset 类的字对齐压缩变体。 我们提供 64 位和 32 位类似 RLE 的压缩方案。 它可用于实现位图索引。 它所依赖的 EWAH 格式用于运行 GitHub 的 git 实现。 字对齐压缩的目标不是实现最佳...
RoaringBitmap, 在Java中,一个更好的压缩 bitset RoaringBitmap Bitsets,也称为位图,通常用作快速数据结构。 不幸的是,他们可以使用太多的内存。 为了补偿,我们经常使用压缩位图。咆哮位图是压缩位图,它比传统...
bitset是Java中的一种数据结构,通过使用bitset可以实现毫秒级查询。下面我们将详细讲解如何使用bitset实现毫秒级查询。 bitset的内部实现是long数组,每一个位的默认值为false(0)。bitset的长度可以按需增长,...
java bitset源码 目前进度(171/237) LeetCode做题笔记 Add two numbers:给定一个数集合和一个数,已知集合中有两个数的和是给定数,求这两个加数的index 方法1:暴力,n^2时间复杂度,不推荐 方法2:快速排序nlogn...
Java编程中的HashSet和BitSet详解 HashSet和BitSet是Java编程中两个常用的集合类,它们都可以用来存储大量的数据,但它们之间有着明显的差异。那么,为什么Apache Commons作者选择使用BitSet代替HashSet呢?在本文...
在标题提及的 "javabitset源码-montysolr:Solr天体物理数据系统" 中,我们可以推测这个项目可能是在Solr(一个流行的全文搜索引擎)中使用BitSet来处理天体物理数据。下面我们将深入探讨Java BitSet以及它如何应用于...
bitset 源码 all-kinds-book 主要包含 java 大数据 数据仓库 数据分析 第三方组件 面试题 数据结构与算法 设计模式 软件设计 等文档 ,可以访问我们的官网查看更多内容 [人在地上跑 牛在天上飞](#人在地上跑 牛在...
java bitset源码 Study 少有人走的路 数据结构 队列 集合 链表、数组 字典、关联数组 栈 树 二叉树 完全二叉树 平衡二叉树 二叉查找树(BST) 红黑树 B,B+,B*树 LSM 树 BitSet 常用算法 计数排序 桶排序 基数排序 ...
bitset源码 这个仓库主要放一些 Demo 示例 目录 1. Kotlin 实现 IGetInt java 接口的方法示例: public class IGetInt { String get(int i); String get(Integer i); } 2. Java 并发示例 此部分Demo基本用于实现 《》...
java bitset 源码 redis-bloomFilter redis-bloomFilter是基于redis的bitset实现的bloomfilter.具体原理和实现思路可以参考 使用 redis-bloomFilter发布在JitPack,可以选择下载源码编译,或者通过jitpack源添加依赖...
Java提供了强大的数据处理工具,如ByteBuffer和BitSet,以及各种字符编码的转换方法。 8. **事件驱动编程**:如果读卡器支持事件通知,例程可能会采用事件监听器模式,当读卡器检测到新卡片或者其他事件时,触发...