`
raymond.chen
  • 浏览: 1441128 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Bitset数据结构的使用

    博客分类:
  • Java
 
阅读更多

Bitset是Java中的一种数据结构。Bitset中主要存储的是二进制位,做的也是位运算,每一位只用来存储0,1值,主要用于对数据的标记。

 

BitSet是位操作的对象,值只有0或1(即true 和 false),内部维护一个long数组,初始化只有一个long segement,所以BitSet最小的size是64;随着存储的元素越来越多,BitSet内部会自动扩充,一次扩充64位,最终内部是由N个long segement 来存储。

 

Bitset的基本原理是,用1位来表示一个数据是否出现过,0为没有出现过,1表示出现过。默认情况下,BitSet所有位都是0即false。

 

JDK选择long数组作为BitSet的内部存储结构是出于性能的考虑,在and和or的时候减少循环次数,提高性能。

 

应用场景:海量数据去重、排序、压缩存储

 

优点:按位存储,内存占用空间小

缺点:线程不安全

 

基本操作:

BitSet bitSet1 = new BitSet();
BitSet bitSet2 = new BitSet();

for(int i=0; i<15; i++){
	if(i%3 != 0 && i%5 != 0) bitSet1.set(i);
	if(i%2 == 0) bitSet2.set(i);
}

bitSet1.and(bitSet2); //交集
bitSet1.or(bitSet2); //并集
bitSet1.andNot(bitSet2); //返回左BitSet中,不在右BitSet的数据
bitSet1.xor(bitSet2); //返回左右BitSet中,不在左右BitSet的数据
bitSet1.intersects(bitSet2); //两边都有位值为true的数据,则返回true

bitSet1.set(100); //标识索引为100的位有数据
System.out.println(bitSet1.get(100)); //获取索引为100的位是否有数据

System.out.println(bitSet1.size()); //集合大小,64的倍数
System.out.println(bitSet1.length()); //数据集的长度
System.out.println(bitSet1.cardinality()); //位值为true的个数

bitSet1.set(100);

//返回指定index及其后的第一个位值为true的index,找不到返回-1
System.out.println(bitSet1.nextSetBit(0));  
System.out.println(bitSet1.nextSetBit(14));
System.out.println(bitSet1.nextSetBit(15));

//返回指定index及其前的第一个位值为true的index,找不到返回-1
System.out.println(bitSet1.previousSetBit(200)); 
System.out.println(bitSet1.previousSetBit(14));
System.out.println(bitSet1.previousSetBit(0));

 

去重排序:

ThreadLocalRandom rnd = ThreadLocalRandom.current();
		
//数据初始化
int arrayLength = 10;
int[] array = new int[arrayLength];
for(int i=0; i<arrayLength; i++){
	array[i] = rnd.nextInt(arrayLength * 10);
}
System.out.println(Arrays.toString(array));

//将数据放入BitSet中,会去重
BitSet bitSet = new BitSet();
for(int i=0; i<array.length; i++){
	bitSet.set(array[i]);
}

//递增排序显示
int i = 0;
for(i=bitSet.nextSetBit(0); i>=0; i=bitSet.nextSetBit(i+1)){
	System.out.print(i + ", ");
}
System.out.println();

//递减排序显示
for(i=bitSet.previousSetBit(bitSet.length()); i>=0; i=bitSet.previousSetBit(i-1)){
	System.out.print(i + ", ");
}
System.out.println();

 

分享到:
评论

相关推荐

    RoaringBitmap, 在Java中,一个更好的压缩 bitset.zip

    RoaringBitmap, 在Java中,一个更好的压缩 bitset RoaringBitmap Bitsets,也称为位图,通常用作快速数据结构。 不幸的是,他们可以使用太多的内存。 为了补偿,我们经常使用压缩位图。咆哮位图是压缩位图,它比传统...

    Go-bitset-Go包实现bitsets

    位集是一种特殊的数据结构,它使用二进制位来表示一系列布尔值,通常用于存储有限集合的成员资格。Go的`bitset`包实现了这个概念,提供了快速的插入、删除和查询操作,对于处理大量布尔状态或者节省内存非常有用。在...

    C++数据结构头文件

    在C++编程中,数据结构是至关重要的一个领域,它涉及到如何有效地组织和管理数据,以便于高效地访问和操作。...通过实践和深入研究,你可以更好地掌握这些数据结构的使用方法和内部机制,从而成为更优秀的C++程序员。

    数据结构常用头文件

    在编程领域,数据结构是构建高效算法...这些头文件的使用,可以帮助你更高效地编写和实现各种数据结构,提高代码的可读性和可维护性。通过熟练掌握这些头文件中的功能,你可以更好地理解和运用数据结构,提升编程技能。

    c++ bitset实现

    `C++ bitset` 是一个内置的类型,用于在内存中高效存储和操作位序列。在C++标准库中,`&lt;bitset&gt;` 头文件提供了`std...通过这样的实践,开发者可以更好地理解C++标准库的工作原理,并能根据特定需求定制自己的数据结构。

    数据结构课程设计:手机通通讯录模拟,24点扑克牌游戏)

    在整个项目实施过程中,还需要关注数据结构的优化,比如使用Set来避免重复计算,使用优先队列(PriorityQueue)来实现最小堆优化搜索效率,或者使用BitSet进行位运算以节省空间。此外,良好的编程习惯,如代码注释、...

    java 原生包 BitSet 源码

    Java中BitSet类是Java集合框架的一部分,它是一种用于处理位操作的高级数据结构。BitSet可以看作是一个只存储布尔值的数组,但相比于原始的布尔数组,BitSet更加内存高效,因为它以64位的块(word)来存储多个布尔值...

    Java 数据结构详细教程

    Java 数据结构详细教程 Java 数据结构是 Java 编程语言中的一种基本组成部分,它提供了强大的数据结构来存储和管理数据。在 Java 中的数据结构主要包括枚举、位集合、向量、栈、字典、哈希表、属性等接口和类。 ...

    Java工具包提供了强大的数据结构

    Java 作为一种广泛使用的开发语言,其工具包(Java API)为开发者提供了丰富的数据结构支持,使得程序员能够高效地处理各种复杂的数据。在Java早期版本中,一些基础数据结构包括枚举(Enumeration)、位集合(BitSet...

    浅谈Java BitSet使用场景和代码示例

    因为 BitSet 使用 long 数组作为内部存储结构的,所以可以处理大规模的数据。另外,BitSet 还可以使用逻辑与、逻辑或和逻辑异或操作来进行数据统计和分析。 BitSet 的应用举例 例如,在阿里的实习面试中,有一个...

    使用bitset实现毫秒级查询(实例讲解)

    bitset是Java中的一种数据结构,通过使用bitset可以实现毫秒级查询。下面我们将详细讲解如何使用bitset实现毫秒级查询。 bitset的内部实现是long数组,每一个位的默认值为false(0)。bitset的长度可以按需增长,...

    Java的数据结构.docx

    Java语言提供了丰富的数据结构,这些数据结构在编程中扮演着重要的角色,帮助我们高效地组织和管理数据。以下是关于标题和描述中提到的几个关键数据结构的详细说明: 1. 枚举(Enumeration) 枚举在Java中是一种...

    大数据杀手锏:揭秘 C++ 中 BitSet 与 BloomFilter 的神奇性能!

    本篇博客深入探讨了 C++ 中的两种重要数据结构——BitSet 和 BloomFilter。我们首先介绍了它们的基本概念和使用场景,然后详细分析了它们的实现方法,包括高效接口设计和性能优化策略。接着,我们通过对比这两种数据...

    java bitset 源码解析.rtf

    java bitset 高级数据结构 源码解析 适合 0-3 年开发人员,进阶、面试必备知识!

    前端项目-bitset.js.zip

    - **内存效率**:bitset.js通过紧凑的数据结构减少了内存占用,相比于使用布尔数组,对于大量数据,它可以显著减少内存消耗。 - **计算效率**:通过高效的位运算,bitset.js能够快速完成位级操作,尤其是在进行...

    最最适用的java数据结构全集

    在这个“最最适用的Java数据结构全集”中,你将找到一系列关于如何在Java中实现和使用各种数据结构的源代码。让我们深入探讨一下这些核心概念。 1. **数组(Array)**:数组是最基础的数据结构,它允许我们在内存中...

    基本基于java的数据结构.zip

    13. **堆栈和队列的实现** - 使用数组或链表可以实现栈和队列,Java中的`java.util.Stack`和`java.util.Queue`接口提供了抽象层,便于实现不同的数据结构。 14. **跳表(Skip List)** - 跳表是一种可以快速查找的...

    java数据结构知识点集合.doc

    本文将详细介绍 Java 中的传统数据结构接口和类,包括枚举(Enumeration)、位集合(BitSet)、向量(Vector)、栈(Stack)、字典(Dictionary)、哈希表(Hashtable)以及属性(Properties)。此外,还将简要介绍 ...

    数据结构电子深圳大学自动化dsPPT学习教案.pptx

    数据结构是计算机科学中至关重要的一个分支,主要研究如何高效地组织和管理数据,以便进行快速的查询、插入、删除等操作。在这个深圳大学自动化专业的数据结构(PPT)学习教案中,重点讲解了集合和字典这两种数据结构...

Global site tag (gtag.js) - Google Analytics