java bitset用途_BitSet的用法

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:标明一个字符串中用了哪些字符

importjava.util.BitSet;public classWhichChars{private BitSet used = newBitSet();publicWhichChars(String str){for(int i=0;i< str.length();i++)

used.set(str.charAt(i));//set bit for char

}publicString 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 voidmain(String args[]){

WhichChars w=new WhichChars("How do you do");

System.out.println(w);

}

}

运行:

C:\work>java WhichChars

[ Hdouwy]

4

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

这样就省下了很大空间。

例子:

packagecom;importjava.util.BitSet;public classMainTestThree {/***@paramargs*/

public static voidmain(String[] args) {

BitSet bm=newBitSet();

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

例子2:

packagecom;importjava.util.BitSet;public classMainTestFive {/***@paramargs*/

public static voidmain(String[] args) {int[] shu={2,42,5,6,6,18,33,15,25,31,28,37};

BitSet bm1=newBitSet(MainTestFive.getMaxValue(shu));

System.out.println("bm1.size()--"+bm1.size());

MainTestFive.putValueIntoBitSet(shu, bm1);

printBitSet(bm1);

}//初始全部为false,这个你可以不用,因为默认都是false

public static voidinitBitSet(BitSet bs){for(int i=0;i

bs.set(i,false);

}

}//打印

public static voidprintBitSet(BitSet bs){

StringBuffer buf=newStringBuffer();

buf.append("[\n");for(int i=0;i

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

temp=zu[i];

}

}

System.out.println("maxvalue:"+temp);returntemp;

}//放值

public static void putValueIntoBitSet(int[] shu,BitSet bs){for(int i=0;i

bs.set(shu[i],true);

}

}//true,false换成1,0为了好看

public static String getBitTo10(booleanflag){

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。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html select选择事件_按键精灵的Html系列命令实战讲解

金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot&#xff0c;Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚本以及网赚脚本等各个领域。想学习按键精灵的朋友可以添加金猪脚本粉丝交流群:554…

java多线程意义_Java多线程学习之多线程的概念及意义

Java的线程机制&#xff0c;则是由执行程序表示的单一进程创建的任务(拗口&#xff01;)&#xff0c;注意&#xff0c;是在单一进程里面创建多个任务&#xff0c;不同于操作系统分叉外部进程。由于所有的任务在同一个进程内&#xff0c;任务之间会相互干涉(例如操作同样的对象&…

java 验证码_java学习之web基础(6):使用Response的输出流在页面输出验证码

package 输出并且我们可以写一个简单的网页&#xff0c;来实现点击更新验证码<!DOCTYPE html>

java socket编程实现聊天程序_java Socket编程 聊天程序 服务器端和客户端

[java]代码库package com.gufengxiachen.sthreadchatapp;/*** author GUXIA*/import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;imp…

电商前台模板中文html5_跨境电商平台上产品如何上传?虾皮新版批量上传工具使用指南分享...

大家好&#xff0c;这里是天师跨境&#xff0c;今天来为电商新人们解答一下关于如何在跨境电商平台上上传产品的疑惑&#xff0c;顺便介绍一下虾皮跨境平台的新版批量上传工具是如何使用的。在跨境电商平台上开店的新手们在入驻成功后&#xff0c;一般最先面临的问题就是上传产…

移动端 关闭浏览器事件_前端开发中什么是移动端点透事件?

点透事件&#xff1a;是指两个元素其中一个元素具有默认的点击事件&#xff0c;当我们让不具有点击事件的元素隐藏起来&#xff0c;会触发另一个元素的点击事件&#xff0c;这种行为被称之为点透事件。如下图所示&#xff1a;当我们给div元素添加touchstart事件让div元素隐藏起…

java web 线程数_Java Web应用调优线程池

最简单的单线程我们先从基础开始。无论使用哪种应用服务器或者框架(如Tomcat、Jetty等)&#xff0c;他们都有类似的基础实现。Web服务的基础是套接字(socket)&#xff0c;套接字负责监听端口&#xff0c;等待TCP连接&#xff0c;并接受TCP连接。一旦TCP连接被接受&#xff0c;即…

清除浏览器缓存之后为什么还是显示旧的html页面_Web缓存控制策略详解

管理Web缓存的最常用和最有效的方法之一是通过Cache-Control HTTP标头&#xff0c;由于此标头适用于Web页面的缓存&#xff0c;这意味着我们页面上的所有内容都可以具有非常精细化的缓存策略。通过各种自定义策略&#xff0c;我们控制的策略就可以变得非常复杂和强大。Cache-Co…

js二维数组_Javascript数组

数组的概念&#xff1a;引用类型的对象。本质&#xff1a;内存中存储多个数据的空间&#xff0c;再取个名字。数据结构&#xff1a;数据结构不同&#xff0c;擅长的操作不同。数组特点&#xff1a;便于数据的查找与维护。数组的创建&#xff1a;方法1&#xff1a;var 数组名【元…

java jtextfield 事件_JAVA JTextField事件处理

初学JAVA&#xff0c;笔记&#xff1a;package windows;import javax.swing.*;import java.awt.*;import java.awt.event.*;class WindowFlow extends JFrame implements ActionListener{private static final long serialVersionUID 1L;JTextField text1,text2;WindowFlow(St…

js封装函数_JavaScript基础-如何封装函数来改变元素的位置

点击右上方红色按钮关注“小郑搞码事”&#xff0c;每天都能学到知识&#xff0c;搞懂一个问题&#xff01;大家好&#xff01;我是/小郑搞码事/的小郑今天给大家分享JavaScript的基础知识-改变元素的位置。没错&#xff0c;用JS实现过动画的同学都应该了解一点&#xff0c;简单…

python查找指定字符所在行号_python查找字符串中某个字符

本文收集整理关于python查找字符串中某个字符的相关议题&#xff0c;使用内容导航快速到达。内容导航&#xff1a;Q1&#xff1a;Python里统计一个字符串中另一个字符串的个数答案为3(用正则)&#xff1a;1234>>>importre>>>sabababab>>>len(re.fin…

java jai create 方法_使用JAI扩展Java Image的功能

Java Image功能一直都在增强&#xff0c;但是向磁盘写一个图像文件或者返回一个PNG或JPEG依然比较难实现。但是我们可以使用Java Advanced Imaging(JAI)API来解决这个问题。JAI可以从SUN的Java站点下载&#xff0c;它包含在JDK 1.4的javax.imageio包中。要安装JAI&#xff0c;你…

python实现rm_python winrm模块使用

使用session方法###import winrmswinrm.Session(http://10.10.60.14:5985/wsman,auth(administrator,password))rs.run_ps(dir)rs.run_cmd(cd /d d: & test.bat)print r.std_outprint r.std_err使用Protocol方法###import winrmconn winrm.Protocol(endpointhttp://10.10…

java程序设计与实践教程 王薇 doc_Java程序设计与实践教程 王薇主编 答案

Java程序设计与实践教程 王薇 主编 董迎红 副主编 课后习题 答案第1章 JAVA简介一、判断题1.√ 2.√ 3. 4. 5. 6.√ 7.√ 8.√ 9. 10.二、填空题1.Application Applet 2. 类(字节码文件、目标文件) .class3.对象 4. 主 5. J2SE J2EE J2ME三、选择题1.B 2. D 3.B 4.B 5. A四、简…

树莓派python开发工具哪个好_Thonny——树莓派上Python的最新IDE

Thonny是最新的Raspbian系统中直接自带的Python IDE&#xff0c;支持Python3.6&#xff0c;更新到最新的Raspbian之后无需安装其他&#xff0c;就能打开使用。在Menu>Programming中就能找到这个IDE打开之后可以看到主要是两个区域&#xff0c;包括一个代码编辑区和一个shell…

java中常量final的用法_详解Java中final的用法

本文主要介绍了Java中final的使用方法&#xff0c;final是java的关键字&#xff0c;本文就详细说明一下它的使用方法,需要的朋友可以参考下概念final 具有“不可改变的”的含义&#xff0c;可以修饰 非抽象类、非抽象成员方法和变量。用 final 修饰的类不能被继承&#xff0c;没…

python弹球游戏绑定鼠标事件_用python和pygame游戏编程入门-弹球[鼠标控制]

本节我们再将鼠标的事件引入到这个动画中&#xff0c;要做什么呢&#xff1f;就是在动画中&#xff0c;如果按下鼠标左键&#xff0c;小球会停止移动&#xff0c;如果松开左键&#xff0c;小球会移动到鼠标的位置&#xff0c;然后继续刚才的运动&#xff1b;如果按下鼠标左键不…

maya藤蔓插件_Maya特效制作之植物生长动画制作教程(二)之多条藤蔓动画制作...

四、制作多条蔓藤植物下面我们要让很多植物在这个“崖壁”上生长出来&#xff0c;也就是要重复很多次前面的工作&#xff0c;当然可以这样一步一步地做&#xff0c;在“崖壁”面片上手动画很多的线&#xff0c;但下面尝试一种新的方法来制作&#xff0c;让粒子在“崖壁”面片Pl…

python自动发邮件运行正常就是收不到邮件是为什么_python stmp module 163邮箱发送邮件不成功...

开发环境:系统:Ubuntu 16.04 LTS版本:python 3.5.2邮箱服务器:stmp.126.com注意:1.不可正文群发带图,不然会被stmp.126.com认定为垃圾邮件,发不出去 - -!!! 也就是说该代码群发的话,只能用plain纯文本模式.2.由于我的邮箱服务器是126的,所以建议也使用126邮箱测试,测试的前提是…