Java Bitset
Bitset创建一种特殊的数组来保存非负整数的值
取值为true和false,初始都是false。Bitset初始化是一个long,65位,增加位数的话只能是64的整数倍。
如果用一个Bitset存储一组数组【2,4,6,8】,将会是这样的:
找出最大值8,给其加1=9
声明一个Bitset bs[9]
bs[9]=[0,0,1,0,1,0,1,0,1]//数组从第0位到第8位分别代表的是0,1,2,3,4,5,6,7,8,所以bs数组里为1 的就代表有值,为0的就代表没有值
0是false,1是true。
查看BitSet初始化值的代码
package study.stage1;
import java.util.BitSet; /**
* Created by Sandy.Liu on 2017/7/11.
*/
public class BitsetTest {
public static void main(String[] args){
BitSet bs1 = new BitSet();
System.out.println("is bs1 empty: "+bs1.isEmpty()+ " bs1.size: "+bs1.size());
bs1.set(1);
System.out.println("is bs1 empty: "+bs1.isEmpty()+ " bs1.size: "+bs1.size());
bs1.set(65);
System.out.println("is bs1 empty: "+bs1.isEmpty()+ " bs1.size: "+bs1.size()); }
} 运行结果
is bs1 empty: true bs1.size: 64
is bs1 empty: false bs1.size: 64
is bs1 empty: false bs1.size: 128
实例2:void and (BitSet set)
package study.stage1;
import java.util.BitSet; /**
* Created by Sandy.Liu on 2017/7/11.
*/
public class BitSetTest1 {
public static void main(String[] args){
//初始化两个Bitset
BitSet bs1 = new BitSet();
BitSet bs2 = new BitSet();
//给两个bitset赋值
for(int i = 0;i<30;i++){
if(i%2==0){
bs1.set(i);
}
if(i%5==0){
bs2.set(i);
}
}
System.out.println("bs1: "+bs1);
System.out.println("bs2: "+bs2); //bs1 and bs2,值存储在bs1中
bs1.and(bs2);
System.out.println("bs1 and bs2: "+bs1); }
}
运行结果:
bs1: {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28}
bs2: {0, 5, 10, 15, 20, 25}
bs1 and bs2: {0, 10, 20}
分析:
bs1[10101010101010101010101010101]
bs2[100001000010000000001]
所以bs1 and bs2后的值为:【100000000010000000001】,所以就是{0,10,20}
存储的时候会对重复的数字过滤,重复的数字只记一次。
BitSet中实现了Cloneable中的方法如下:
1. void and(BitSet set) 对此目标位和参数位set执行逻辑与操作
2. void andNot(BitSet bet) :
bs1.andNot(bs2) 清除bs1当中存在于bs2中的位。
bs2: {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28}
bs1: {0, 5, 10, 15, 20, 25}
bs1.andNot(bs2): {5,15,25}
3. int cardinality() 返回此BitSet中设置我true的位数
bs1: {0, 5, 10, 15, 20, 25}
bs1.cardinality(): 6
4. void clear() 将所有的位设置为false
5 void clear(int index) 将索引指定的位设置为false
6. void clear(int startIndex, int endIndex) 将startIndex(包括)到endIndex(不包括)之间的位设置为false
7. object clone()复制此BitSet,生成一个相等的新的BitSet。需要注意的是新的BitSet是object类型,赋值给BitSet类型需要强制类型转换
bs1: {0, 5, 10, 15, 20, 25}
bs2
bs2 = (BitSet)bs1.clone();
8. boolean equals(object Bitset) 与指定的对象进行比较
9. boolean getIndex(int index) 返回指定位置处的位值
bs1.getIndex(5): true
10. BitSet get(int startIndex, int endIndex)
返回一个新的 BitSet,它由此 BitSet 中从 fromIndex(包括)到 toIndex(不包括)范围内的位组成。
11. int hashCode( )
返回此位 set 的哈希码值。
12. boolean isEmpty( )
如果此 BitSet 中没有包含任何设置为 true 的位,则返回 ture。
13. int length( )
返回此 BitSet 的"逻辑大小":BitSet 中最高设置位的索引加 1。
bs1: {0, 5, 10, 15, 20, 25}
bs2.length(): 26
14. int size( )
返回此 BitSet 表示位值时实际使用空间的位数。
bs1: {0, 5, 10, 15, 20, 25}
bs2.size(): 64
Java Bitset的更多相关文章
- Java BitSet解决海量数据去重
先提一个问题,怎么在40亿个整数中找到那个唯一重复的数字? 第一想法就是Set的不可重复性,依次把每个数字放入HashSet中,当放不去进去的时候说明这就是重复的数字,输出这个数字. if(hs.co ...
- java bitSet简单使用
package Contain; import java.util.BitSet; public class MyBitset { public static void main(String[] a ...
- Java BitSet使用场景和示例
一.什么是BitSet? 注:以下内容来自JDK API: BitSet类实现了一个按需增长的位向量.位Set的每一个组件都有一个boolean值.用非负的整数将BitSet的位编入索引.可以对每个编 ...
- 位集合(BitSet)| Java数据结构
Java Bitset类 BitSet使用示例: import java.util.BitSet; public class BitSetDemo { public static void main( ...
- (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例)
(私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例) https://pan.baidu.com/s/1L54VuFwCdKVnQGVc8vD1TQnwmj java手册 Ja ...
- 日常Java 2021/10/14
Java数据结构 Java BitSet类 BitSet类创建一种特殊类型的数组来保存位值,数组大小随需要增加,BitSet(),BitSet(int size) 其中的方法 void and(Bit ...
- 日期的压缩存储daybits
问题: 存储一个日期的序列,例如保存用户一年的登录时间序列,20140201,20130102这样两个日期,如果用INT那么需要八个字节,用STRING就更多了. 解决: 通过bit来存储一天,具体的 ...
- JavaBitSet学习
一.背景 之前公司项目需要对会员人群进行去重过滤,人群的维度是user_id: 因此采用了BitSet做简单的去重,方案将user_id作为bitset中的bit索引: 通过and\or\xor基础运 ...
- 20180824-Java Enumeration 接口
Java Enumeration接口 Enumeration接口中定义了一些方法,通过这些方法可以枚举(一次获得一个)对象集合中的元素. 这种传统接口已被迭代器取代,虽然Enumeration 还未被 ...
随机推荐
- SharePoint Framework 在Visual Studio Code中调试你的托管解决方案
博客地址:http://blog.csdn.net/FoxDave 上一篇介绍了如何在本地调试你的SharePoint Framework解决方案,本篇介绍如何调试你的SharePoint Onl ...
- <Spark Streaming><Flume><Integration>
Overview Flume:一个分布式的,可靠的,可用的服务,用于有效地收集.聚合.移动大规模日志数据 我们搭建一个flume + Spark Streaming的平台来从Flume获取数据,并处理 ...
- adb shell按键操作(input keyevent)
前言:input keyeven操作发送手机上常用的一些按键操作 一.keyevent事件对应数字 电话键 KEYCODE_CALL: 拨号键 KEYCODE_ENDCALL: 挂机键 KEYCODE ...
- nginx——ngx_http_gzip_module
文件压缩 Syntax: gzip on | off; Default: gzip off; Context: http, server, location, if in location Synta ...
- Nginx日志和http模块相关变量
$arg_PARAMETER #HTTP 请求中某个参数的值,如/index.php?site=www.ttlsa.com,可以用$arg_site 取得 www.ttlsa.com 这个值. $ar ...
- Delphi 10.3.1来了
10.3.1发布了,这个版本可以独自安装,是对Delphi 10.3 Rio,C ++ Builder 10.3 Rio和RAD Studio 10.3 Rio的更新.如果安装了2018年11月发布的 ...
- kbmMW 5.08.10试用报告
1.不兼容Android 基于5.07的项目,升级到5.08,不能编译android app.已经反应给作者.作者回复将近快发布fixed,修正这个问题及其他发现的问题. 5.08.01解决了andr ...
- DRF-Rest_Framework 学习文档
序列化器(serializer) 定义Serializer 1. 定义方法 Django REST framework中的Serializer使用类来定义,须继承自rest_framework.ser ...
- python 3.x 字典的11种方法
python 3.x 字典的11种方法2017年11月25日 01:02:11 Milton-Long 阅读数:535 标签: python python字典方法 更多个人分类: python-学习之 ...
- c# GetType()和typeof()的区别
c# GetType()和typeof()的区别 C#中任何对象都具有GetType()方法,返回Type类型的当前对象的类型. GetType()是基类System.Object的方法,因此只有 ...