java.util.BitSet 研究
2019独角兽企业重金招聘Python工程师标准>>>
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
这样就省下了很大空间。
看看测试例子
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位,而不是报错。
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算。
注意它会对重复的数字过滤,就是说,一个数字出现过超过2次的它都记成1.
出现的次数这个信息就丢了。
转载于:https://my.oschina.net/viakiba/blog/1377368
java.util.BitSet 研究相关推荐
- java length 使用方法 例题_java.util.BitSet.length()方法实例
java.util.BitSet.length()方法返回此BitSet的"逻辑大小":在BitSet中最高设置位加一的索引.如果BitSet中没有包含的位,返回0. 声明 以下是 ...
- 实用工具类库java.util
本章介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.例如,Java提供日期(Data)类.日历(Calendar)类来产生和获取日期及时间,提供随机 ...
- Java.util包中常用的类
Java.util包 Java.util.ArrayDeque类 Java.util.ArrayList类 Java.util.Arrays类 Java.util.BitSet类 Java.util. ...
- java获取10位随机数_Java基础:JAVA中BitSet使用详解
适用场景:整数,无重复: Bitset 基础 Bitset,也就是位图,由于可以用非常紧凑的格式来表示给定范围的连续数据而经常出现在各种算法设计中.上面的图来自c++库中bitset的一张图. 基本原 ...
- java.util包详解
介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.本章介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结 ...
- 【Java】java.util.Objects 工具类方法研究
[Java]java.util.Objects 工具类方法研究 Objects 与 Object 区别 Object 是 Java 中所有类的基类,位于java.lang包. Objects 是 Ob ...
- Java 理论与实践: 流行的原子——新原子类是 java.util.concurrent 的隐藏精华(转载)...
简介: 在 JDK 5.0 之前,如果不使用本机代码,就不能用 Java 语言编写无等待.无锁定的算法.在 java.util.concurrent 中添加原子变量类之后,这种情况发生了变化.请跟随并 ...
- java.util.date的格式_java.util.Date格式将yyyy-mm-dd转换为mm-dd-yyyy
我有一个java.util.Date,格式为yyyy-mm-dd. 我希望它的格式为mm-dd-yyyy 以下是我尝试进行此转换的示例util: // Setting the pattern Simp ...
- 【Java 集合】Java 集合的线程安全性 ( 加锁同步 | java.utils 集合 | 集合属性 | java.util.concurrent 集合 | CopyOnWrite 机制 )
文章目录 I . Java 集合的线程安全概念 ( 加锁同步 ) II . 线程不安全集合 ( 没有并发需求 推荐使用 ) III . 集合属性说明 IV . 早期的线程安全集合 ( 不推荐使用 ) ...
- 高并发编程基础(java.util.concurrent包常见类基础)
JDK5中添加了新的java.util.concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法 ...
最新文章
- Java 分页之最简单的算法
- 基于图像的三维模型重建——稠密点云重建
- 为什么要使用设计模式?
- python 版本比较函数 LooseVersion StrictVersion
- 第6章-一阶多智体系统一致性-->6.4 切换拓扑系统一致性
- ubuntu ???????????? no permissions 问题解决
- Nancy跨平台开发总结(六)三层架构之Token认证的Rest API
- AI学习笔记(十一)CNN之图像识别(下)
- linux如何装回工具包,如何找到linux工具软件对应的安装软件包----用which+dpkg 实现...
- 平台如何限制ip流量_社区团购平台如何通过地推获得更多流量?
- H264格式 详细介绍
- 关于查询界面渲染问题
- Adobe完全卸载工具
- PS CC 2014破解版
- javascript获取上一工作日
- quot 成为通用计算机器 quot,汉语拼音:从读写工具到文化津梁
- 数据库技术与应用习题2
- linux开机自动执行脚本、运行程序
- 游戏开发物理引擎PhysX研究系列:通过Unity中的物理系统学习Physx指引贴
- JAVA判断直线与线段相交,判断两个线段是否相交